• hdu 4559 涂色游戏(对SG函数的深入理解,推导打SG表)


    提议分析:

      1 <= N <= 4747

    很明显应该不会有规律的,打表发现真没有

    按题意应该分成两种情况考虑,然后求其异或(SG函数性质)

      (1)找出单独的一个(一列中只有一个)

      (2)找出连续的两个都没有涂色的求SG值(打表)

    #include<stdio.h>
    #include<string.h>
    #define Max 4750
    int dp[Max];
    int mex[Max];
    int flag[Max];
    void Gsdp()
    {
        int i,j;
        int l,r;
        dp[0]=0;
        dp[1]=0;
        for(i=2; i<Max; i++)
        {
            for(j=1; j<=i; j++)
            {
                l=j-1;
                r=i-j;//分成左中右
                mex[dp[l]^1^dp[r]]=i;//涂色1
                if(j+1<=i)
                {
                    l=j-1;
                    r=i-(j+1);
                    mex[dp[l]^dp[r]]=i;//涂色2*2
                }
            }
            //for(j=0; mex[j]==i; j++)少了分号
            j=0;
            while(mex[j]==i)j++;
            dp[i]=j;
        }
        //printf("#%d
    ",dp[13]);
    }
    int main()
    {
        int t,n,m,ans;
        int x,y;
        int i,j,k;
        Gsdp();
        scanf("%d",&t);
        for(i=1; i<=t; i++)
        {
            scanf("%d %d",&n,&m);
    
            memset(flag,0,sizeof(flag));
            for(j=1; j<=m; j++)
            {
                scanf("%d %d",&x,&y);
                flag[y]++;
            }
            int tmp2=0,tmp1=0;
            ans=0;
            for(j=1;j<=n;j++)
            {
                if(flag[j]==1)tmp1++;//单独一个
                if(!flag[j])tmp2++;
                else
                {
                    ans^=dp[tmp2];
                    tmp2=0;
                }
            }
            ans=ans^(tmp1%2)^dp[tmp2];
            printf("Case %d: ",i);
            if(ans)printf("Alice
    ");
            else printf("Bob
    ");
        }
    }
  • 相关阅读:
    poj 2262
    poj 1050
    poj 1730
    poj 1061
    【设计模式】简单工厂模式学习
    【待学】
    [设计模式]策略模式和单一职责
    Windows live writer 误删 草稿 恢复
    [Linq]Linq To Sql (2)
    MVC 学习日志1(上)
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3351842.html
Copyright © 2020-2023  润新知