UVA 10635 - Prince and Princess

题不是很难,但不知道怎么。。。请教下面两个代码有什么不同吗?为什么一个可以A,一个却是WA。

AC:

#include<stdio.h>
#include<string.h>
#define MAXD 70000
int N, P, Q, s[MAXD], r[MAXD];
void solve()
{
    int i, j, p, q, top, mid, max, min;
    scanf("%d%d%d", &N, &P, &Q);
    memset(r, 0, sizeof(r));
    for(i = 1; i <= P+1; i ++)
    {
        scanf("%d", &p);
        r[p] = i;
    }
    s[0] = top = 0;
    for(i = 1; i <= Q+1; i ++)
    {
        scanf("%d", &p);
        q = r[p];printf("q=%d\n",q);
        if(!q)
            continue;
        if(q > s[top])
            s[++ top] = q;
        else
        {
            max = top;
            min = 0;
            for(;;)
            {
                mid = (max + min) / 2;
                if(mid == min)
                    break;
                if(s[mid] < q)
                    min = mid;
                else
                    max = mid;
            }
            s[mid + 1] = q;
        }
    }
    printf("%d\n", top);
}
int main()
{
    int t, tt;
    scanf("%d", &t);
    for(tt = 0; tt < t; tt ++)
    {
        printf("Case %d: ", tt + 1);
        solve();
    }
      getchar();
      getchar();
    return 0;
}

WA:

#include<stdio.h>
#include<string.h>
#define MAXN 70000

int ap[MAXN], aq[MAXN], aso[MAXN], f[MAXN];

int t, p, q, n, num;

void solve()
{
    int top = 0;
    f[0] = 0;
    for(int i = 1; i <= p+1; i ++)
    {
        if(!aso[i]) continue;
        if(aso[i] > f[top]) {top ++; f[top] = aso[i];}
        else
        {
            int x = 0, y = top, mid;
            if(top == 0) f[0] = aso[i];
            while(x < y)
            {
                mid = x +(y-x)/2;
                if(x == mid) break;
                if(f[mid] < aso[i]) x = mid;
                else y = mid;
            }
            f[mid+1] = aso[i];
        }
        //for(int j = 0; j <= top; j ++)
        //printf("j= %d f[j]=%d\n",j ,f[j]);
    }
    printf("Case %d: %d\n",num ++, top+1);
}
int main()
{
        scanf("%d",&t);
        num = 1;
        while(t --)
        {
            scanf("%d%d%d",&n, &p, &q);
            memset(ap, 0,sizeof(ap));
            printf("1\n");
            for(int i = 1; i <= p+1; i ++)
            {
                int x;
                scanf("%d",&x);
                ap[x] = i;
            }
            for(int i = 1; i <= q+1; i ++)
                scanf("%d",&aq[i]);
            for(int i = 1; i <= q+1; i ++)
                {aso[i] = ap[aq[i]];}
            solve();
        }
    return 0;
}
posted on 2012-07-29 22:00  BFP  阅读(201)  评论(0编辑  收藏  举报