UVA 10599 - Robots(II)

又是一道做的不成熟的题:怎么改呢。。。明天想想。。。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 10000+100

int num, n, m, g, e;
int x[MAXN], y[MAXN], f[MAXN], flag[MAXN], p[MAXN], r[MAXN];

int cmp(const void *_p, const void *_q)
{
    int *p = (int *)_p;
    int *q = (int *)_q;
    if(x[*p] == x[*q]) return y[*p]-y[*q];
    else return x[*p] - x[*q];
}

void solve()
{
    int max = 1;
    //memset(flag, 0, sizeof(flag));
    for(int i = 0; i < g; i ++)
    f[i] = flag[i] = 1;
    for(int i = 1; i < g; i ++)
    {
        for(int j = 0; j < i; j ++)
        {
            if(y[r[i]] >= y[r[j]])
            {
                if(f[i] < f[j]+1) {f[i] = f[j] + 1;p[i] = j;}
                if(f[i] <= f[j]+1){flag[i] += flag[j];}
            }
        }
    }
    max = 0;
    int ans = 0;
    for(int i = 0; i < g; i ++)
    {
        if(f[i] > max) {max = f[i];e = i;}
    }
    for(int i = 0; i < g; i ++)
    {
        if(f[i] == max) ans += flag[i]-1;
    }
    if(ans== 0) ans= 1;
    printf("CASE#%d: %d %d",num++,max, ans);
}

void print(int v)
{
    if(p[v] == -1) {printf(" %d",(x[r[v]]-1)*m+y[r[v]]);return;}
    print(p[v]);
    printf(" %d",(x[r[v]]-1)*m+y[r[v]]);
}

int main()
{
    freopen("in.txt", "r",stdin);
    freopen("out1.txt","w",stdout);
    num = 1;
    while(~scanf("%d%d",&n, &m))
    {
        if(n == m && n == -1) break;
        for(g = 0;; g ++)
        {
            int a, b;
            scanf("%d%d",&a, &b);
            if(a == b && a == 0) break;
            x[g] = a; y[g] = b;
        }
        for(int i = 0; i <= g; i ++)
        r[i] = i;
        qsort(r,g, sizeof(r[0]),cmp);
        memset(p, -1, sizeof(p));
        e = -1;
        solve();
        if(e != -1)
        print(e);
        printf("\n");
    }
    return 0;
}
posted on 2012-07-30 20:57  BFP  阅读(246)  评论(0)    收藏  举报