现在的位置: 首页 > 综合 > 正文

poj 1704 Georgia and Bob(阶梯博弈)

2013年09月09日 ⁄ 综合 ⁄ 共 1051字 ⁄ 字号 评论关闭


题目大意:每个测试点最多有T(1 <= T <= 20)个测试数据。如图所示,Georgia和Bob在玩一种自创的游戏。一个无限长的棋盘上有N个旗子(1 <= N <= 1000),第i个棋子的位置可以用Pi表示(1 <= Pi <= 10000)。现在Georgia先走。每个人每一次可以把一枚棋子向左移动任意个格子,但是不能超越其他棋子,也不能和其他棋子处在同一个格子里。如果轮到某一个人的时候Ta再也不能移动棋子了,就判负。现在每个测试数据给定一种情况,如果Georgia会赢,输出“Georgia
will win”,如果Bob会赢,输出“Bob will win”,如果不确定,输出“Not sure”。两个人都知道获胜策略是什么,也会想方设法取得胜利。


首先明确,绝对没有Not sure。怎么会有一盘给定了的棋说不准谁会赢的?!
这个问题可以看作是一种特殊的石子游戏。以第二个样例为例:
1 5 6 7 9 12 14 17
第一个棋子不能向左移动了。第二个棋子可以向左移动3个格子。第三个棋子也不能移动了,以此类推,可以得到这样一个数列:
0 3 0 0 1 2 1 2,第n个数字代表第n个棋子可以移动的步数。
考虑一下把第二个棋子向左移动一格的情况,原数列变为:
0 2 1 0 1 2 1 2
这不就是把“第二堆”石子移了一个到右边的“第三堆”石子么?由此可以给出等价的游戏新定义:
给定N堆石子,每堆里面的石子个数都是非负的。每次可以把第i堆中的任意颗石子移动到第i + 1堆中(1 <= i < N),或者第N堆的石子扔掉任意颗。如果某人不能继续操作则判负。

阶梯博弈:http://blog.csdn.net/hlmfjkqaz/article/details/9612003

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 1005

int main()
{
    int t,i,j,a[N],n,s,b[N];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
           scanf("%d",&a[i]);
        sort(a,a+n);
        j=0;
        for(i=n-1;i>0;i--,j++)
        {
           b[j]=a[i]-a[i-1]-1;
        }
        s=0;
        b[n-1]=a[0]-1;
        for(i=0;i<n;i+=2) s^=b[i];
        if(s) puts("Georgia will win");
        else puts("Bob will win");
    }
    return 0;
}

抱歉!评论已关闭.