hdu1907John
来源:互联网 发布:收费软件下载 编辑:程序博客网 时间:2024/06/05 15:21
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1907
题意:有n个装有若干糖果的盒子,有两个人轮流拿糖果,只能在一个盒子中拿,至少拿一个糖果最多可拿掉整盒。拿完最后一次的人输。
分析:经典的Nim博弈的一点变形。设糖果数为1的叫孤独堆,糖果数大于1的叫充裕堆,设状态S0:a1^a2^..an!=0&&充裕堆=0,则先手必败(奇数个为1的堆,先手必败)。S1:充裕堆=1,则先手必胜(若剩下的n-1个孤独堆个数为奇数个,那么将那个充裕堆全部拿掉,否则将那个充裕堆拿得只剩一个,这样的话先手必胜)。T0:a1^a2^..an=0&&充裕堆=0,先手必胜(只有偶数个孤独堆,先手必胜)。S2:a1^a2^..an!=0&&充裕堆>=2。T2:a1^a2^..an=0&&充裕堆>=2。这样的话我们用S0,S1,S2,T0,T2将所有状态全部表示出来了,并且S0先手必败,S1、T0先手必胜,那么我们只需要对S2和T2的状态进行分析就行了。(a)S2可以取一次变为T2。(b)T2取一次可变为S2或者S1。因为S1是先手必胜态,那么根据a,b这两个转换规则,我们就能得知S2也是先手必胜,T2是先手必败。
代码:
#include<map>#include<set>#include<cmath>#include<queue>#include<bitset>#include<math.h>#include<cstdio>#include<vector>#include<string>#include<cstring>#include<iostream>#include<algorithm>#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;const int N=100010;const int MAX=1000000100;const int mod=100000000;const int MOD1=1000000007;const int MOD2=1000000009;const double EPS=0.00000001;typedef long long ll;const ll MOD=1000000007;const int INF=1000000010;typedef double db;typedef unsigned long long ull;int main(){ int a,i,n,t,g,xo; scanf("%d", &t); while (t--) { scanf("%d", &n); g=xo=0; for (i=1;i<=n;i++) { scanf("%d", &a); xo^=a;if (a>1) g++; } if ((g==0&&n&1)||(g>1&&!xo)) printf("Brother\n"); else printf("John\n"); } return 0;}
0 0
- hdu1907john
- hdu1907John
- hdu1907John 简单博弈
- hdu1907John尼姆博弈
- 【异或】HDU1907John
- hdu1907John(NIM博弈变形)
- HDU1907John(尼姆博弈-先取光者输)
- hdu1907John (尼姆博弈,存在一种特殊情况全为1时)
- git分支的管理策略最佳实践
- 模拟实现通讯录 <一><静态方法>
- github上获取开源软件(如wireshark,Cimage等)源代码的方法
- Go语言的安装和程序启动方法
- HDU 1162 Eddy's picture (最小生成树)
- hdu1907John
- 快的打车架构
- 输入一个单向链表,输出该链表中倒数第k个结点
- struts2和spring mvc,孰优孰劣
- Socket.io-client android 部分源码解析
- fzu 1150 Farmer Bill's Problem
- APM 姿态抗风(干扰 突变) 优化处理
- QT中PRO文件写法的详细介绍
- pgSQL substring(二):查询字段中除字母之外的字段