• 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;
    }
  • 相关阅读:
    乘法逆元
    P1082 同余方程
    数论编程
    倍增LCA模板
    快速幂模板Super
    黑白染色的模板
    暑假提高组集训Day1 T2
    暑假提高组集训Day1 T1
    7月18日刷题记录 二分答案跳石头游戏Getting
    hdu4738(割桥)
  • 原文地址:https://www.cnblogs.com/yuzhaoxin/p/2614361.html
Copyright © 2020-2023  润新知