POJ 1704 Georgia and Bob(nim 博弈的变形)

题意:排成直线的格子上放有n个棋子,第i个棋子在p[i]的格子上,G和B 分别选择一个棋子向左移动,每次可以移动任意格,但是不能反超其他格子,也不能让两个棋子放在一个格子里面,G先,无法移动的一方输吗,问你谁会赢?

思路:我们把每个格子的差看成nim里面的石子的堆数,那么我们每次向左移动石子的时候对于当前石子的左边,就可以看成是往每堆石子里面挑出任意个石子了,那么对于当前石子的右边其实就是往那堆石子里面加入任意颗石子,那么如果解决呢,简单,后手讲他移动相同的格子就好了,这样就变成了原来相同的状态了,那么其实就是差分一下p数组,之后nim一下就好了

上代码把:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 10000+10;
int a[maxn];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		memset(a,0,sizeof(a));
		for(int i = 0 ; i < n ; i++)
		{
			scanf("%d",&a[i]);
		}
		if(n&1) a[n++] = 0;//如果是奇数个我们就添加一个0
		sort(a,a+n);
		int ans = 0;
		for(int i = 0 ; i+1 < n ; i = i+2)
		{
			ans = ans^(a[i+1] - a[i] - 1);
		}
		if(ans==0) puts("Bob will win");
		else puts("Georgia will win");
	}
}

猜你喜欢

转载自blog.csdn.net/wjmwsgj/article/details/80052767
今日推荐