码迷,mamicode.com
首页 > 其他好文 > 详细

Georgia and Bob

时间:2019-05-18 09:42:39      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:its   cstring   char   stream   游戏   递增   mes   code   get   

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;
}

Georgia and Bob

标签:its   cstring   char   stream   游戏   递增   mes   code   get   

原文地址:https://www.cnblogs.com/PPXppx/p/10884564.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!