http://acm.hdu.edu.cn/showproblem.php?pid=4315
题意:有n个人要往坐标为0的地方移动,他们分别有一个位置a[i],其中最靠近0的第k个人是king,移动的时候在后面的人不能越过前面的人,先把king送到0的人胜。
思路:阶梯博弈。把n个人两两配对,形成一个组,即a[i]和a[i+1]是一个组,a[i+2]和a[i+3]是一个组,把a[i]和a[i+1]的距离当成阶梯博弈中的奇数阶的值,a[i+1]和a[i+2]的距离当成偶数阶(不用考虑)。首先k=1时候先手赢。偶数情况下,两两相邻是必败态,因为如果先手移动前面的,后手一定可以使得局面还是两两相邻,然后先手移动king前面的人的时候,后手只要把king移动到终点。如果n是奇数的话,把a[1]走到终点就是偶数的情况。所以如果k是第二个人并且n是奇数的话,第一个人只能移动到1的位置,否则k就能直接移动到0了,因此a[1]要-1。
#include <cstdio>
#include <cstring>
using namespace std;
#define N 1010
int id[N];
int c[N]; int main() {
int n, k;
while(scanf("%d%d", &n, &k) != EOF) {
for(int i = ; i <= n; i++) scanf("%d", id+i);
if(k == ) {
puts("Alice");
} else {
int ans = ;
if(n & && k == ) id[]--;
for(int i = + (n & ); i <= n; i += )
ans ^= (id[i] - id[i-] - );
if(n & ) ans ^= id[];
if(ans) puts("Alice");
else puts("Bob");
}
}
return ;
}