bzoj1022: [SHOI2008]小约翰的游戏John 博弈
2015-01-05 19:23
411 查看
裸的Anti-Nim(其实刚学会我会乱说?),结论是:当且仅当每堆石子为1且游戏SG值为0,或有些堆的石子数大于1且游戏的SG值不为0时,先手必胜。
特殊情况不难证明,当SG值不为0时,若还有至少两堆石子的数目大于1,则先手将SG值变为0即可,若只有一堆石子数大于1,则先手总可以将状态变为有奇数个1。所以,当SG不为0时先手必胜。当SG为0时,至少有两堆石子的数目大于1(否则高位无法异或成0),则先手决策完之后,必定至少有一堆的石子数大于1,且SG值不为0,由上段的论证我们可以发现,此时,无论先手如何决策,都只会将游戏带入先手必胜局,所以先手必败。
特殊情况不难证明,当SG值不为0时,若还有至少两堆石子的数目大于1,则先手将SG值变为0即可,若只有一堆石子数大于1,则先手总可以将状态变为有奇数个1。所以,当SG不为0时先手必胜。当SG为0时,至少有两堆石子的数目大于1(否则高位无法异或成0),则先手决策完之后,必定至少有一堆的石子数大于1,且SG值不为0,由上段的论证我们可以发现,此时,无论先手如何决策,都只会将游戏带入先手必胜局,所以先手必败。
#include<bits/stdc++.h> using namespace std; int T,n,ans; int main() { scanf("%d",&T); while(T--) { ans=0; bool ok=true; scanf("%d",&n); for(int i=1;i<=n;i++) { int a; scanf("%d",&a); ans^=a; if(a!=1) ok=false; } if(ok) printf("%s\n",ans?"Brother":"John"); else printf("%s\n",ans?"John":"Brother"); } return 0; }
相关文章推荐
- [BZOJ1022][SHOI2008]小约翰的游戏John(博弈Anti-Nim游戏)
- [博弈] BZOJ1022: [SHOI2008]小约翰的游戏John
- bzoj1022【SHOI2008】【小约翰的游戏John】【博弈论】
- BZOJ1022 [SHOI2008]小约翰的游戏John 【博弈论】
- [bzoj1022][SHOI2008]小约翰的游戏 John (博弈论)
- [Anti-Nim Anti-SG SJ定理] BZOJ 1022 [SHOI2008]小约翰的游戏John
- 【bzoj1022】【SHOI2008】【小约翰的游戏John】【博弈论】
- BZOJ 1022: [SHOI2008]小约翰的游戏John
- 12.7 bzoj1022 [SHOI2008]小约翰的游戏John
- AC日记——[SHOI2008]小约翰的游戏John bzoj 1022
- bzoj1022[SHOI2008]小约翰的游戏John
- BZOJ_1022_[SHOI2008]_小约翰的游戏John_(博弈论_反Nim游戏)
- bzoj1022 [SHOI2008]小约翰的游戏John
- BZOJ 1022: [SHOI2008]小约翰的游戏John
- BZOJ 1022 SHOI2008 小约翰的游戏John 博弈论
- bzoj1022[SHOI2008]小约翰的游戏John
- [bzoj1022][SHOI2008]小约翰的游戏John (反Nim游戏)
- BZOJ 1022 [SHOI2008]小约翰的游戏John
- BZOJ 1022 [SHOI2008]小约翰的游戏John 题解与分析
- bzoj 1022: [SHOI2008]小约翰的游戏John 博弈论