阶梯博弈-HDU3389
来源:互联网 发布:网络共享硬盘无法访问 编辑:程序博客网 时间:2024/05/17 00:15
其实这道题不难,不要理解错了就行,就像我一开是把题目中的A,B理解成盒子中卡片的数量了,就直接做不出来了,所以由此可见,认真读题是多么的重要!!!
1 3 4号盒子是不能够再转移卡片到其他盒子中去了的,其他盒子中的卡片经过若干步的转移最终也一定会转移到1 3 4号盒子中去。
具体来说,n % 6 == 0 或 2 或 5的盒子,经过奇数步转移到1 3 4中去,其他的则须经过偶数步才能转移过去。
下面来证明,所有卡片都在偶数步盒子中是必败状态。
因为不论先手将偶数步的盒子中卡片移走了多少,后手一定可以把这些卡片再往前移动一个盒子,直到移到1 3 4中去为止。
对于只有一个盒子有卡片,而且这个盒子是奇数步盒子来说,先手必胜。
很简单,根据上面的结论,只要先手把这个奇数步盒子中所有卡片全部往下移一个盒子就好了。这样就转移到了先手必败状态。
整个游戏可以看做若干个子游戏的和游戏,偶数步盒子不予考虑,只考虑奇数步盒子中的卡片,这就相当于一个n堆石子的Nim游戏。
在一个奇数步盒子中移走k张卡片,相当于在某一堆石子中取走k个石子。把所有石子取完相当于,所有的卡片都在偶数步的盒子里面,而我们已经证明完这种状态是必败状态了。
所以在代码中就只需要将奇数步盒子中的卡片数异或一下求个Nim和,就能判断胜负了。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define ll long longusing namespace std;int main(){ int t; scanf("%d",&t); int ca=1; while(t--) { int n,x,ans=0; scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&x); if(i%6==0||i%6==2||i%6==5) ans^=x; } if(ans) printf("Case %d: Alice\n",ca++); else printf("Case %d: Bob\n",ca++); } return 0;}
阅读全文
0 0
- HDU3389(阶梯博弈)
- hdu3389(阶梯博弈变形)
- 阶梯博弈-HDU3389
- [HDU3389]Game(阶梯博弈)
- hdu3389 Game NIM博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- hdu3389 Game-----博弈想法题 难
- hdu3389
- HDOJ4315[阶梯博弈]
- BNU12889阶梯博弈
- HPUoj 1415(小ho的0 1串)
- margin-top失效, css + div 布局之 CSS盒模型 外边距合并问题 问题表述: 那天晚上一个同学给我发来一个问题,原型大概是“一个maindiv嵌套了一个div.class="he
- mysql用户权限设置
- java文件下载
- 简单单解决你的事务回滚问题
- 阶梯博弈-HDU3389
- zookeeper 配置启动报错(org.apache.zookeeper.server.quorum.QuorumPeerMain)
- SpringBoot自动配置
- Docker
- ECMAScript 2016 (ES7)
- HDU 5974 A Simple Math Problem 数学
- leetcode[Array Partition I]//待整理多种解法
- android 签名打包时去掉log日志打印(仅在debug包中打印log信息)
- Spring学习(四)-Bean的三种装配方式