Georgia and Bob
作者:互联网
POJ
题意:给定\(N\)个数,Georgia和Bob轮流操作,每次可以让一个数减去一个正整数,但要保证数列严格单调递增,求谁会获胜?
分析:如果没有保证数列严格单调递增这个限制,就是传统的Nim博弈---取石子游戏.于是考虑把它往Nim上靠.我们把\(N\)个数先\(sort\)排序,从最后一个数开始拆成两个两个来看,如果第一个数落单,就看作和第0个数凑成了一对.
对于一对数,如果对手让前一个数减去了一个数,我们就可以直接让后一个数减去同一个数,对于这一种情况,我们可以看作什么都没有发生,因为不会影响到结果;
而如果对手让后一个数减去了一个数,此时如果我们让前一个数也减去相同的数,可能会造成前一个数比 前一对数的后一个数 要小,不符合题意,也就是说减去的这一个数是会影响到最后的结果的,而减去的这一个数也有范围限制,即\(a[i]-a[i-1]-1\).
我们把每一对数的这个值拎出来,就变成了传统的取石子游戏---谁没办法再取谁就输了.
//#include<bits/stdc++.h>
#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
int a[1005];
int main(){
int T=read();
while(T--){
int ans=0,n=read();
for(int i=1;i<=n;i++)a[i]=read();
sort(a+1,a+n+1);
for(int i=n;i>=1;i-=2)ans^=(a[i]-a[i-1]-1);
//因为是严格单调递增,所以还要减去1
if(ans)puts("Georgia will win");
else puts("Bob will win");
}
return 0;
}
标签:ch,一个,Georgia,减去,对数,Bob,include 来源: https://www.cnblogs.com/PPXppx/p/10884564.html