题意:排成直线的格子上放有n个棋子,第i个棋子在p[i]的格子上,G和B 分别选择一个棋子向左移动,每次可以移动任意格,但是不能反超其他格子,也不能让两个棋子放在一个格子里面,G先,无法移动的一方输吗,问你谁会赢?
思路:我们把每个格子的差看成nim里面的石子的堆数,那么我们每次向左移动石子的时候对于当前石子的左边,就可以看成是往每堆石子里面挑出任意个石子了,对于当前石子的右边其实就是往那堆石子里面加入任意颗石子,这个时nim里面没有的那么如果解决呢,简单,后手将他移动相同的格子就好了,这样就变成了原来相同的状态了,那么其实就是差分一下p数组,之后nim一下就好了
上代码把:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 10000+10;
int a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
memset(a,0,sizeof(a));
for(int i = 0 ; i < n ; i++)
{
scanf("%d",&a[i]);
}
if(n&1) a[n++] = 0;//如果是奇数个我们就添加一个0
sort(a,a+n);
int ans = 0;
for(int i = 0 ; i+1 < n ; i = i+2)
{
ans = ans^(a[i+1] - a[i] - 1);
}
if(ans==0) puts("Bob will win");
else puts("Georgia will win");
}
}