HDU 4315 阶梯博弈变形

n个棋子,其中第k个是红色的,每个棋子只能往上爬,而且不能越过、重叠其他棋子,谁将红色棋子移到顶部谁赢。

由于只能往上爬,所以很像阶梯博弈。这题有2个限制,棋子不能重叠,有红棋存在

首先不考虑红色棋,那么我们可以视棋于棋间的距离为石子堆,这样棋子两两分组就是奇数堆,组与组间的距离就是偶数堆。

有个特殊情况k=2时,此时第一个区间石子数要减小1,不能移完,否则后手直接就能取胜了。

 

 

 

 

/** @Date    : 2017-10-13 23:13:24
  * @FileName: HDU 4315 阶梯博弈变形.cpp
  * @Platform: Windows
  * @Author  : Lweleth (SoungEarlf@gmail.com)
  * @Link    : https://github.com/
  * @Version : $Id$
  */
#include <bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 1e3+20;
const double eps = 1e-8;


int a[N];
int main()
{
	int n, k;
	while(~scanf("%d%d", &n, &k))
	{
		a[0] = 0;
		for(int i = 1; i <= n; i++)
		{
			scanf("%d", a + i);
		}
		if(k == 1)
		{
			printf("Alice\n");
			continue;
		}
		int sgs = 0;
		if(n % 2)
		{
			for(int i = 0; i + 1 <= n; i += 2)
				sgs ^= a[i + 1] - a[i] - 1;
			if(k != 2)//特殊情况
				sgs ^= a[1] ^ (a[1] - 1);
		}
		else 
		{
			for(int i = 1; i + 1<= n; i += 2)
				sgs ^= a[i + 1] - a[i] - 1;
		}
		if(sgs)
			printf("Alice\n");
		else printf("Bob\n");
	}
    return 0;
}//两两分组 
posted @ 2017-10-16 22:30  Lweleth  阅读(381)  评论(0编辑  收藏  举报