题目:POJ1704.
题目大意:给定
1
∗
n
1*n
1∗n的棋盘,
m
m
m颗棋子的坐标为
a
1
,
a
2
,
.
.
.
,
a
m
a_1,a_2,...,a_m
a1,a2,...,am.现在两人轮流操作,每次操作可以把一颗棋子往左移,但不能超过它左边的棋子或走出棋盘(初始坐标
1
1
1),无法操作的人输,问是否先手必胜.
有
T
(
1
≤
T
≤
20
)
T(1\leq T\leq 20)
T(1≤T≤20)组数据,数据均满足
1
≤
n
≤
1
0
3
,
1
≤
a
i
≤
1
0
4
1\leq n\leq 10^3,1\leq a_i\leq 10^4
1≤n≤103,1≤ai≤104.
这貌似是博弈论中经典的模型,叫阶梯型博弈.
考虑这个模型是否可以转化为NIM博弈.考虑只有两颗棋子的情况,这个时候我们发现右边的棋子往左可以转化为取一定数量的石子,左边的棋子往左可以通过右边的棋子走相同数量的步数来抵消,这样问题就变成了NIM博弈问题.
考虑一般情况,我们可以两颗棋子一组,若总棋子数为奇数则可以考虑让坐标 0 0 0与它组成一组即可.
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define Abigail inline void
typedef long long LL;
const int N=1000;
int a[N+9],n,ans;
Abigail into(){
scanf("%d",&n);
for (int i=1;i<=n;++i)
scanf("%d",&a[i]);
}
Abigail work(){
ans=0;
sort(a+1,a+1+n);
for (int i=n;i>0;i-=2)
ans^=a[i]-a[i-1]-1;
}
Abigail outo(){
puts(ans==0?"Bob will win":"Georgia will win");
}
int main(){
int T;
scanf("%d",&T);
while (T--){
into();
work();
outo();
}
return 0;
}