HDU1850 本题为一道,尼姆博弈的一道改进题目,题目问题是给你几堆扑克;让你判断如果你能赢,你第一次操作都能使对手败的操作次数有多少种。根据题目大致可以根据其特点,得到如下思路;因为你每次能从任意选择一堆并取走其中的任意张牌。那么,只要看每一堆中有多少种操作;只要每一次中改变的不使之得到如下结果ai^k<ai:
对于某个局面(a1,a2,...,an),若a1^a2^...^an!=0,一定存在某个合法的移动,将ai改变成ai'后满足 a1^a2^...^ai'^...^an=0。不妨设a1^a2^...^an=k,则一定存在某个ai,它的二进制表示在k的最高位上是1(否则k的 最高位那个1是怎么得到的)。这时ai^k<ai一定成立。则我们可以将ai改变成ai'=ai^k,此时 a1^a2^...^ai'^...^an=a1^a2^...^an^k=0。超过他数值那么使操作次数加1
具体代码如下:
#include"stdio.h"
int d[110];
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
int i,res=0,sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&d[i]);
res=res^d[i];
}
for (i=0;i<n;i++)
{
if ((res^d[i]) < d[i])
{
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}