/*
*State: 1704    Accepted    200K    16MS    C++    594B
*题目大意:
*        一个1*M的棋盘上有N个棋子,初始位置一定,两人轮流操作,
*        每次移动一枚棋子,要求只能向左移且至少移动一格,而且不
*        能到达或经过以前有棋子的格子,谁无法移动棋子就算输。
*解题思路:
*        先考虑两个棋子靠在一起的时候,这两对棋子就构成了一个
*        奇异局势(P点)。所以可以把题目中的棋子分解为两对两对,
*        两对两对之间是不需要考虑什么的。在同一对棋子中,如果对
*        手移动前一个,你总能对后一个移动相同的步数,所以一对
*        棋子的前一个和前一对棋子的后一个之间有多少个空位置对
*        最终的结果是没有影响的。每两对构成一组,而这两对之间就
*        是一堆石子。然后就可以Nim博弈了。注意如果是奇数个棋子,
*        首个棋子要跟棋盘首构成一对。
*/
View Code
#include <iostream>
#include <stdio.h>
#include <algorithm>

using namespace std;

const int MAX = 10005;

int main(void)
{
    int cas;
    scanf("%d", &cas);
    while(cas--)
    {
        int ini[MAX];
        int n;
        scanf("%d", &n);
        for(int i = 0; i < n; i++)
            scanf("%d", &ini[i]);
        sort(ini, ini + n);
        
        int sum = 0;
        for(int i = n - 1; i >= 0; i -= 2)
        {
            int tmp;
            if(i == 0)
                tmp = ini[i] - 1;
            else
                tmp = ini[i] - ini[i - 1] - 1;
            sum ^= tmp;
        }

        if(!sum)
            printf("Bob will win\n");
        else
            printf("Georgia will win\n");
    }
    return 0;
}
posted on 2012-07-26 15:27  cchun  阅读(1445)  评论(0编辑  收藏  举报