HDU 4315:Climbing the Hill(阶梯博弈)

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。

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 #define N 1010
 5 int id[N];
 6 int c[N];
 7 
 8 int main() {
 9     int n, k;
10     while(scanf("%d%d", &n, &k) != EOF) {
11         for(int i = 1; i <= n; i++) scanf("%d", id+i);
12         if(k == 1) {
13             puts("Alice");
14         } else {
15             int ans = 0;
16             if(n & 1 && k == 2) id[1]--;
17             for(int i = 2 + (n & 1); i <= n; i += 2)
18                 ans ^= (id[i] - id[i-1] - 1);
19             if(n & 1) ans ^= id[1];
20             if(ans) puts("Alice");
21             else puts("Bob");
22         }
23     }
24     return 0;
25 }

 

转载于:https://www.cnblogs.com/fightfordream/p/6194612.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值