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)。也就是说,必胜态总有下一个状态为必败态;必败态的下一个状态必为必胜态。
题意: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; }
相关文章推荐
- HDU 1907 John nim博弈变形 Anti-SG
- hdu 1907 John (anti—Nim)
- hdu 1907 John(anti-nim)
- HDU_1907 John(Anti-Nim)
- HDU 1907 John(尼姆博弈之ANTI-SG游戏)
- HDU 1907 John nim博弈变形
- hdu 1907 John&& hdu 2509 Be the Winner(基础nim博弈)
- HDU 1907 John (Nim博弈)
- HDU 1907 John (ANTI-SG)
- HDU 1907 John(Nim游戏 取完为输)
- HDU 1907 John ( Nim Game )
- HDU(2509) Be the Winner /HDU(1907) John (Nim 博弈)
- hdu_1907:John(Nim变形)
- HDU 1907、2907 【NIM、anti-NIM】
- HDU 1907 John(Nim game)
- (hdu 1907)John (Misère Nim,Nim博弈的变形)
- hdu 1907 John(组合游戏 NIM变形)@
- hdu 1907 John Nim博弈 最后一个取石子者输
- HDU 2509 Be the Winner && HDU 1907 John (Nim博弈变形)
- HDU-1907 John (Anti-SG)