poj1704 Georgia and Bob
从只有几个棋子开始考虑
只有一个的话先手必胜
只有两个的话先手如果动前一个棋子,那么后手一定也可以动
那么先手唯一的方案就是动后面的棋子
这样的话如果有三个,先手动中间的那一个是没有意义的,后手一定可以动最后于一个
如果先手动第一个,后手动中间的也是没有意义的,那么后手要不动第一个要不动最后一个
这样的话中间棋子的位置无所谓,我们只关心第一个棋子的位置,和最后一个棋子到前一个棋子的距离
这样的话这场博弈两两棋子一组,如果是奇数总数把第一个和所谓"0"绑定一下就可以了
然后每一组,如果先手动第一个棋子是没有意义的,两个棋子碰到一块,那么后手必胜,所以问题的关键就是如何把每一组变成两个靠在一块
方法就是,
nim博弈
然后这个题就结束了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
int t;
int a[100001];
int sum;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;++i) {
scanf("%d",&a[i]);
}
if(n&1){
n++;
a[n]=0;
}
sort(a+1,a+n+1);
sum=0;
for(int i=1;i<=n;i+=2){
sum^=(a[i+1]-a[i]-1);
}
if(!sum){
printf("Bob will win\n");
}else{
printf("Georgia will win\n");
}
}
return 0;
}