分析:
有不少博弈问题都是Nim游戏的变体:
对于所有可以移动的棋子,考虑两个相邻的棋子
先手移动前一个棋子,后手就可以模仿操作移动相等的步数
这样操作后这两个相邻棋子之间的间隔大小是不会有变化的
我们把序列上的所有棋子两两绑定
如果棋子个数是奇数,第一个棋子与位置0配对
两两成组,组与组之间是不会互相影响的
那么单独看一组:
想要消除之间的间隔,唯一的方法就是移动后一个棋子
我们可以把间隔视为Nim游戏中的一堆石子
整个问题就转化成了朴素的Nim游戏了
tip
每一堆石子的个数: a[i]−a[i−1]−1 a [ i ] − a [ i − 1 ] − 1
dada们把这种博弈称为:阶梯博弈
一般的解决方法就是两两抱团(奇数就把第一个单独提出),来做Nim
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1005;
int n,a[N];
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
int t=0;
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
if (n&1)
{
t^=(a[1]-1);
for (int i=3;i<=n;i+=2)
t=t^(a[i]-a[i-1]-1);
}
else
{
for (int i=2;i<=n;i+=2)
t=t^(a[i]-a[i-1]-1);
}
if (!t) printf("Bob will win\n");
else printf("Georgia will win\n");
}
return 0;
}