题目大意:有N堆火柴,每堆火柴数告诉你,现在有两个玩家A,B,每个人每一个回合可以且仅可以在任意一堆里取出任意多根火柴(取的火柴数不能为0)
最后取完所有的火柴的人胜利,现在问你先取的人是赢还是输(两个人足够聪明)
分析:显然这是一道博弈论的题目。
当两堆的时候不难发现,两堆数量相同(达到平衡状态),那么先取的人必输。
当多堆的时候,有个平衡点,每个数对应一个二进制数(前面不足用0补上),如果N个数的个个位相加起来是偶数,那么该位是平衡位,如果所有的位都是平衡位,那么该状态为平衡状态。
好了,今天有点晚了,就不详细写了,直接贴上代码(不懂的地方可以评论,我会详解的):
1 #include<stdio.h> 2 int main() 3 { 4 int n; 5 while(scanf("%d",&n) !=EOF){ 6 int m,ans=0; 7 while(n--){ 8 scanf("%d",&m); 9 ans^=m; 10 } 11 if(ans) printf("Yes\n"); 12 else printf("No\n"); 13 } 14 return 0; 15 }