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