标签:
Description
Input
Output
Sample Input
3 5 7 9尼姆博弈 0
Sample Output
1
分析:看到这个题完全不知道如何下手,想了很久也没有思路,于是去网上搜了一下。原来这个是组合博弈中的尼姆博弈,然后自己理解了一下,才做出来了。尼姆博弈主要要用位运算,将所有非奇异局势变成奇异局势,谁面对奇异局势就一定输。
AC代码:
#include <iostream> #include<cstdio> using namespace std; int main() { int a,t; int s[111]; while(~scanf("%d",&t)) { if(t==0) break; int sum=0,ans=0; for(int i=1;i<=t;i++) { scanf("%d",&a); ans^=a;//位运算 s[i]=a; }
//所有的按位与a[i]的按位等于除a[i]的所有堆的按位,此值若小于a[i],则只要在a[i]中取出一定的值,
// 就能形成奇异局势(先手必输,后手必赢的状态);
for(int j=1;j<=t;j++)
{
if((s[j]^ans)<s[j])//s[j]^ans此运算如果不加括号区分的话就会出现格式错误
//再次异或后结果没有参与异或的那堆数量即能完成必胜点到必败点的转折
sum++;
}
printf("%d\n",sum);
}
return 0;
}//注意:几个简单的位运算技巧 N^0=N;N^N=0;ans^N^N=ans;
标签:
原文地址:http://www.cnblogs.com/lbyj/p/5738195.html