题意:排成直线的格子上放有n个棋子,第i个棋子在p[i]的格子上,G和B 分别选择一个棋子向左移动,每次可以移动任意格,但是不能反超其他格子,也不能让两个棋子放在一个格子里面,G先,无法移动的一方输吗,问你谁会赢?
思路:我们把每个格子的差看成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"); } }