poj1704 Georgia and Bob

又是个我好像没学过的博弈。。。

阶梯博弈是这样的:游戏开始时有许多硬币任意分布在楼梯上,从地面由下向上编号为0到n。 游戏者在每次操作时可以将楼梯j(1≤j≤n)上的任意多但至少一个硬币移动到楼梯j-1上。 游戏者轮流操作,将最后一枚硬币移至地上的人获胜。

这道题就把两个棋子之间的空间看作一个阶梯上的硬币,这个阶梯是左高右低的,向左移动棋子相当于空格向右,把硬币向下送

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

int a[11000];
int len,s[11000];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        
        len=0;a[0]=0;
        for(int i=n;i>=1;i--)s[++len]=a[i]-a[i-1]-1;
        
        int ans=0;
        for(int i=1;i<=len;i++)
            if(i%2==1)ans^=s[i];
            
        if(ans==0)printf("Bob will win\n");
        else printf("Georgia will win\n");
    }
    return 0;
}

 

posted @ 2018-08-03 16:33  AKCqhzdy  阅读(115)  评论(0编辑  收藏  举报