BZOJ 1022 SHOI2008 小约翰的游戏John 博弈论
2016-04-03 15:37
316 查看
题目大意:反Nim游戏,即取走最后一个的人输
首先状态1:假设全部的堆都是1,那么堆数为偶先手必胜,否则先手必败
然后状态2:假设有两个堆数量同样且不为1,那么后手拥有控场能力,即:
若先手拿走一堆,那么后手能够选择将还有一堆留下1个或者全拿走,使这两堆终于仅仅剩1个或0个;
若先手将一堆拿剩一个,那么后手能够选择将还有一堆留下一个让先手拿或全拿走,使这两堆终于仅仅剩1个或0个;
若先手将一堆拿走一部分。那么后手能够将还有一堆相同拿走一部分,然后同上
状态3:若Xor!=0 那么先手能够先拿走一部分让Xor=0 然后同状态2先手必胜 否则先手必败
※鉴于本人过于沙茶,以上内容仅存在參考价值。无法证明正确性,欢迎指正
于是若全部堆全是1 Xor==0先手必胜 否则后手必胜
若有堆不是1 Xor==0后手必胜 否则先手必胜
首先状态1:假设全部的堆都是1,那么堆数为偶先手必胜,否则先手必败
然后状态2:假设有两个堆数量同样且不为1,那么后手拥有控场能力,即:
若先手拿走一堆,那么后手能够选择将还有一堆留下1个或者全拿走,使这两堆终于仅仅剩1个或0个;
若先手将一堆拿剩一个,那么后手能够选择将还有一堆留下一个让先手拿或全拿走,使这两堆终于仅仅剩1个或0个;
若先手将一堆拿走一部分。那么后手能够将还有一堆相同拿走一部分,然后同上
状态3:若Xor!=0 那么先手能够先拿走一部分让Xor=0 然后同状态2先手必胜 否则先手必败
※鉴于本人过于沙茶,以上内容仅存在參考价值。无法证明正确性,欢迎指正
于是若全部堆全是1 Xor==0先手必胜 否则后手必胜
若有堆不是1 Xor==0后手必胜 否则先手必胜
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n; bool Calculate() { int i,x,xor_sum=0; bool flag=1; cin>>n; for(i=1;i<=n;i++) { scanf("%d",&x); if(x^1) flag=0; xor_sum^=x; } if(flag) return !xor_sum; else return xor_sum; } int main() { int T,i; for(cin>>T;T;T--) { if( Calculate() ) puts("John"); else puts("Brother"); } }
相关文章推荐
- 96. Unique Binary Search Trees
- Server.MapPath方法的应用方法
- Tsinsen A1107 比赛安排
- spring MVC配置form支持PUT和DELETE方法
- Java 时间格式转换
- bootstrap适配移动端
- AQS(1):引言
- RPC,REST,WebService的区别
- TimesTen中应尽量使用CHAR替代VARCHAR2类型
- 跳转到主界面“UIStoryboard”
- WordPress公布新文章Email通知注冊用户
- 深入理解 IE haslayout
- 【汇编】mov [1000],bx:immediate operand not allowed
- Java并发:线程间同步机制:条件队列和同步工具类
- HDU 1170
- TimesTen的inline和out-of-line数据类型
- huffman
- 中国近现代史上文笔最好的十位作家
- 二叉树--链表实现
- 二叉树--链表实现