Description

Input
Output
Sample Input
2 3 1 2 3 8 1 5 6 7 9 12 14 17
Sample Output
Bob will win Georgia will win
题目大意:
给一个1*M的棋盘,上面有N颗棋子,每人每次只能向左移动一颗棋子,并且至少移动一步,两人轮流操作,如果某人不能移动棋子了,那他就输了。
解题思路:将棋子分成两两一组,如果棋子数是奇数,前面补0。如果先手移动的是一组当中左边的棋子,那么后手只要将该组右边的棋子移动相同的步数,就行了;如果先手移动的是右边的棋子,将两颗棋子之间的距离看作是石子的数目,只需按照取石子的操作即可。本题是尼姆博弈类型,有N堆石子,两人轮流取,每人每次至少取一个,最后取完石子的人赢。
将棋子分组后,两两棋子之间的距离为L1,L2,L3,……,Ln,则L1^L2^L3^……^Ln=0时,Bob赢,否则,Georgia赢。
代码如下:
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
	int i,j,t,N,T,P[1005];
    scanf("%d",&T);
    while (T--)
    {
		scanf("%d",&N);
		for(i=1;i<=N;i++)
			scanf("%d",&P[i]);
		sort(P+1,P+1+N);//从小到大排序
		t=0;
		j=1;
		if(N%2==1)//N是奇数时
		{
			t=P[1]-1;
			j++;
		}
		for(i=j;i<=N;i+=2)
		{
			t^=P[i+1]-P[i]-1;
		}
		if(t==0)
			puts("Bob will win");
		else
			puts("Georgia will win");
    }
    return 0;
}
B - Georgia and Bob,布布扣,bubuko.com
原文地址:http://blog.csdn.net/yanghuaqings/article/details/38346375