HDU - 3389 Game(阶梯博弈?)

题意:编号1-n的盒子,当你的编号满足(是编号!编号!编号!) B<A && (A+B)%2=1 && (A+B)%3=0的时候你可以从a中取至少一个石头到b不能取的人输问你输赢。

思路:

借一下网上的图啊


由这里可以看出,只有1,3,4他们不能接着往后移动,也就是说所有的都归到了1,3,4,也就是说当你把卡片归到1,3,4,里面的时候,其实就是把石子堆中的石子给抽走了(因为已经没有办法在移动了),之后我们又可以看到只有i%6 ==0 || 2 || 5的时候他有奇数步到达汇点,其他的都是偶数步到达汇点,但是偶数步的情况我们可以不考虑,因为它可以想阶梯博弈里面的偶数台阶一样,如果你在偶数步里拿了一个,那么下一个人一定可以将他移动到下一个盒子里面去,所以我们只用考虑奇数步的就好了

上代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 10000+100;
int a[maxn];
int main()
{
	int t;
	scanf("%d",&t);
	int Case = 0;
	while(t--)
	{
		int n;
		scanf("%d",&n);
		for(int i = 1 ; i <= n ; i++)
		{
			scanf("%d",&a[i]);
		}
		int ans = 0 ;
		for(int i = 1 ; i <= n ; i++)
		{
			if(i % 6 == 0 || i % 6 == 2 || i % 6 == 5)
			{
				ans = ans ^ a[i];
			}
		}
		printf("Case %d: ",++Case);
		if(ans)
		{
			puts("Alice");
		}
		else 
		{
			puts("Bob");
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wjmwsgj/article/details/80197714