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;
}
上一篇:OpenJudge 4120 硬币


下一篇:$POJ1704\ Georgia\ and\ Bob$ 博弈论