看了尼姆博弈的简单情况,然后找了这道题来看,刚开始看的时候没啥思路,以为这情况不多了去了。、
后来才发现,有n堆物品,最多有n个情况,因为一次只能拿一堆的物品,所以在这一堆拿多少受限于其他n-1堆,所以就可以枚举所有的奇异局势,看目前这一堆需要多少个物品才能满足奇异局势,(上面这些是针对开始时候是非奇异局势来说的),然后求出来这个值再与之比较,如果比当前值小则res++。
而且要注意,开始要计算一下初始状态是不是奇异局势。
----------------------------------------------------------------------------------------------------------------
Being a Good Boy in Spring Festival
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2505 Accepted Submission(s): 1438
Problem Description
一年在外 父母时刻牵挂
春节回家 你能做几天好孩子吗
寒假里尝试做做下面的事情吧
陪妈妈逛一次菜场
悄悄给爸爸买个小礼物
主动地 强烈地 要求洗一次碗
某一天早起 给爸妈用心地做回早餐
如果愿意 你还可以和爸妈说
咱们玩个小游戏吧 ACM课上学的呢~
下面是一个二人小游戏:桌子上有M堆扑克牌;每堆牌的数量分别为Ni(i=1…M);两人轮流进行;每走一步可以任意选择一堆并取走其中的任意张牌;桌子上的扑克全部取光,则游戏结束;最后一次取牌的人为胜者。
现在我们不想研究到底先手为胜还是为负,我只想问大家:
——“先手的人如果想赢,第一步有几种选择呢?”
Input
输入数据包含多个测试用例,每个测试用例占2行,首先一行包含一个整数M(1<M<=100),表示扑克牌的堆数,紧接着一行包含M个整数Ni(1<=Ni<=1000000,i=1…M),分别表示M堆扑克的数量。M为0则表示输入数据的结束。
Output
如果先手的人能赢,请输出他第一步可行的方案数,否则请输出0,每个实例的输出占一行。
Sample Input
3 5 7 9 0
Sample Output
1
Author
lcy
Source
ACM Short Term Exam_2007/12/13
Recommend
lcy
------------------------------------------------------------------------------------------
1 #include <stdio.h> 2 int main() 3 { 4 int num[100+10]; 5 int i,j,res,t; 6 int sign; 7 while(scanf("%d",&t)&&t!=0) 8 { 9 res=0; 10 for(i=0;i<t;++i) 11 { 12 scanf("%d",&num[i]); 13 } 14 sign=0; 15 for(i=0;i<t;++i) 16 { 17 sign=sign^num[i]; 18 } 19 if(sign==0){ printf("0\n"); continue;} 20 21 for(i=0;i<t;++i) 22 { 23 sign=0; 24 for(j=0;j<t;++j) 25 { 26 if(j==i) continue; 27 28 sign=sign^num[j]; 29 } 30 if(sign<num[i]) res++; 31 } 32 printf("%d\n",res); 33 } 34 return 0; 35 }