标签:
Time Limit: 1000MS | Memory Limit: 10000KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
2 3 1 2 3 8 1 5 6 7 9 12 14 17
Sample Output
Bob will win Georgia will win
首先认识一下什么是阶梯博弈。注意这个网址中所说的“2^3^4=5 不为零所以先手必败”是错的
异或不为0应该是先手必胜,说反了。
http://blog.csdn.net/kk303/article/details/6692506
1 5 6 7 9 12 14 17
第一个棋子不能向左移动了。第二个棋子可以向左移动3个格子。第三个棋子也不能移动了,以此类推,可以得到这样一个数列:
0 3 0 0 1 2 1 2,第n个数字代表第n个棋子可以移动的步数。
考虑一下把第二个棋子向左移动一格的情况,原数列变为:
0 2 1 0 1 2 1 2
这不就是把“第二堆”石子移了一个到右边的“第三堆”石子么?由此可以给出等价的游戏新定义:
给定N堆石子,每堆里面的石子个数都是非负的。每次可以把第i堆中的任意颗石子移动到第i + 1堆中(1 <= i < N),或者第N堆的石子扔掉任意颗。如果某人不能继续操作则判负。
注意最右面的棋子不是一直不动的,因为要保证异或值为0,所以最右面的棋子也要动。
把这个问题看做是每一个石子相对于前一个石子运动。
#include <iostream> #include <algorithm> using namespace std; int main() { int t; cin>>t; while(t--) { //注意在本题中若循环跑的是1到n 在运算过程中一定不能视a[0]默认为0 新定义的数组a[0]不一定是0 int n,a[1005],ans=0; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); for(int i=n-1;i>=1;i--) a[i]=a[i]-a[i-1]-1; a[0]-=1; for(int i=n-1;i>=0;i-=2) ans^=a[i]; if(ans) cout<<"Georgia will win"<<endl; else cout<<"Bob will win"<<endl; } return 0; }
POJ1704 Georgia and Bob (阶梯博弈)
标签:
原文地址:http://www.cnblogs.com/Ritchie/p/5624705.html