poj 1740

楼教主的男人八题之一。。

输入n,n个数即n堆石子。
可以从其中一堆中拿走最少1颗石子,可以把剩下的石子分配到其他非0的一堆或者几堆。Alice先拿,Bob后;最后没的拿输。A赢1,反之0。
下面说的n严格的说输入的n,是除去一堆中为0的n。
n=1,必胜;
n=2,x=y必败,B可以跟着A走;x!=y必胜,A可以转换成x=y;
n=3,x=y必胜,拿掉z就变成(x,y,0)且x=y,B处于必败;x<y<z,z肯定能填补y-x,就可以变成(x,x,0)B必败。n=3必胜
n=4,a=b=c=d或a=b,c=d A必败B跟着拿;a=b=c,d和a=b,c,d A都可以转换成a=b=c=d或者a=b,c=d,此时B必败。a<b<c<d,d-a>b-c所以能变成a,c,c,a;必胜。

n=2k-1,把最高的那一堆拿出来填补相邻高度的两堆,最高高度肯定是够填的,高度差在坐标轴上不会相交,最终能变成k-1堆相等的石头....
n=2k,至少两堆不相同时,把最高和最低的之差的石子拿去填补,能变成k堆相同的石子,必胜;如果每两堆相等,必败。

#include<stdio.h>
#include<string.h>
int main ()
{
    int n,num[120],x,flag;
    int i,j,k;
    while (scanf("%d",&n)&&n)
    {
        memset(num,0,sizeof(num));
        for (i=0;i<n;++i)
        {
            scanf("%d",&x);
            num[x]++;
        }
        flag=0;
        for (i=1;i<101;++i)
        {
            if (num[i]&1)
            {
                flag=1;
                break;
            }
        }
        printf("%d\n",flag);
    }
    return 0;
}

 

posted @ 2012-12-01 14:33  _hikaru__  阅读(475)  评论(0编辑  收藏  举报