这道题可以转化为经典的Nim游戏来解决。
Nim游戏是这样的
有n堆石子,每堆各有ai个。 两个人轮流在任意石子堆中取至少1个石子,不能再取的输。
解决方法如下, 对N堆石子求异或 为0则甲必胜 否则乙必胜 证明略。
对于这道题目 两个棋子的间距可以当作Nim石子的一堆来处理,
当然,在这个题目中 玩家把左边的棋子向左移动后等于给Nim石堆增加了石子,不过无伤大雅。只要减去对应的石子数就回到了原状态
代码很简单 输入数据是无序的 需要排序
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; const int MAXN=1001; int N,P[MAXN]; void solve() { if(N%2==1){P[N++]=0;sort(P,P+N);} int x=0; for(int i=0;i+1<N;i+=2) x^=(P[i+1]-P[i]-1); if(x==0)printf("Bob will win "); else printf("Georgia will win "); } int main() {freopen("t.txt","r",stdin); int T; scanf("%d",&T); while(T--) { scanf("%d",&N); for(int i=0;i<N;i++) scanf("%d",&P[i]); sort(P,P+N); solve(); } return 0; }