您的位置:首页 > 其它

HDU 1907 John(anti-nim)

2012-12-05 17:35 453 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1907

题意:n堆石子,两人轮流操作,每次操作只能选定其中一堆,并取走若干个(>=1个)。谁取走最后一个石子谁输。给定一个状态,问先取的赢还是后取的赢。

思路:结论:

(1)所有堆的石子均为1且SG为0,先手必胜;

(2)有些堆的石子大于1且SG不为0,先手必胜。

(3)所有堆的石子均为1且SG不为0,后手必胜;

(4)有些堆的石子大于1且SG为0,后手必胜。

证明:(1)的下一个状态必为(3);(2)分两种情况,第一种大于1的堆数等于1,则下一个状态为(3)否则下一个状态为(4);(3)的下一个状态为(1),(4)的下一个状态为(2)。也就是说,必胜态总有下一个状态为必败态;必败态的下一个状态必为必胜态。

#include <iostream>
#include <cstdio>
using namespace std;

int C;
int n;

int main()
{
for(scanf("%d",&C);C--;)
{
scanf("%d",&n);
int i,flag=0,ans=0,x;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(x>1) flag=1;
ans^=x;
}
if(!flag&&!ans||flag&&ans) puts("John");
else puts("Brother");
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: