HDU 4315 Climbing the Hill(阶梯博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=4315
题意:
由上至下有多个格子,最顶端的是山顶,有多个球,其中有一个球是king,每次可以将球向上移动任意个格子,但是不可以跨越别的球。现将king移动到山顶者赢。
思路:
和poj1704是差不多的,如果不懂阶梯博弈的话,可以看看我的这篇博客http://www.cnblogs.com/zyb993963526/p/7868315.html。
现在还是两两分组,谁没空格可移肯定是必败状态,为什么呢?首先,如果king是在每组中的右边,那么这肯定是必败的,如果king在每组中的左边,当先手移动后,后手可以选择是否药改变当前状态,所以还是必败的。
但是要注意总球数是奇数并且king在第二个的情况,此时第一个求会和-1相邻,但是这样相邻后第一个球就是在0的位置,也就是到山顶没了,这样先手直接就赢了,所以此时要将第一组的格子数-1,不能移动到山顶。
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int n, k; 6 int a[1005]; 7 8 int main() 9 { 10 while(~scanf("%d%d",&n,&k)) 11 { 12 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 13 if(k==1) 14 { 15 puts("Alice"); 16 continue; 17 } 18 a[0] = -1; 19 int ans = 0; 20 if(n%2 && k==2) a[0]=0; 21 for(int i=n;i>0;i-=2) 22 { 23 ans^= a[i]-a[i-1]-1; 24 } 25 if(ans) puts("Alice"); 26 else puts("Bob"); 27 } 28 return 0; 29 }