HDU-4315 Climbing the Hill
题目链接
先回到阶梯博弈的裸题中,比如POJ-1704,所有的块只能向左移并且不能跨越,这个向左移的结果我们可以理解为将左边的宽度减少使得右边的宽度增加,等同于阶梯模型中将石子从高阶移动到低阶。那么最右边的一对相邻块之间的宽度就是第一阶的石子个数,从右到左依次为为第一阶第二阶......用变量来表示如下:
设块初始位置为\(a[1],a[2]...a[n]\),那么在阶梯模型中第一阶的石子个数为\(a[n]-a[n-1]-1\)(想一想为什么减一),第二阶为\(a[n-2]-a[n-3]-1\cdots\) 以此类推如果n为偶数,那么最高的一阶为\(a[2]-a[1]-1\),否则为\(a[1]-1\)
在阶梯博弈中,我们将奇数阶的石子转换为nim游戏中的一堆石子,原因是:
如果对奇数阶石子进行挪动,等同于在nim游戏中取走石子
如果对偶数阶石子挪动到奇数阶,我们总可以在下一步操作中将移过去的石子再转移到它现在的一下阶上,使得奇数阶石子并没有发生变化。
这样就可以保证这个游戏等价转换为nim游戏。
为什么要用奇数阶石子来代替?
因为1阶可以移动到0阶,而移动过去的石子再也没有办法移动了。
为什么要转换为nim游戏?因为游戏初始的那一刻,在保证双方都绝顶聪明的情况下胜负已分,一定会用等价于nim的游戏策略进行下去。
好了到此为止阶梯博弈基础重述完毕。
在这道题目中,我们要使得k这个位置上面的人先到达终点,既然这样,那么k-1位置上面的人必须先一步到达终点。所以我们要找一个局面,使得对手不得不把k-1位置上面的人移动过去。
首先 k = 1的话先手必胜
然后我们把这个模型转换为阶梯模型,从右向左开始组队
n为奇数时:\((a_0,a_1),(a_2,a_3),\cdots (a_{n-1},a_n)\)
n为偶数时:\((a_1,a_2),(a_3,a_4),\cdots(a_{n-1},a_n)\)
我们之前提到,改变这些对中两个数的差完全等同于nim游戏。
假设现在他们所有的差异或起来是0,那么先手只可能移动奇数位上面的数字(例如\(a_3\)),那么后手就会跟进(例如\(a_4\)),保持这个局面一直不变。
设一对数中第一个数是\(fi\) (例如n为奇数时的\(a_2\)),第二个数是\(se\)(例如n为偶数时的\(a_3\))。
k 是\(se\) 时很好理解,先手迟早会移动k-1,后手只需要跟着移动总能赢。
若k在\(fi\) 时,我们设想,先手总会把 k-2 这个位置移动到终点,我们只需要在下一步将第k-1个位置移动到终点前就好了(这是为了逼迫先手在之后无路可走时,移动k-1),然后只需等待先手挪动了k-1,我们就可以挪动k到终点了。
一般情况下n为奇数时,\(a_0 = -1\),\(a_1-a_0-1\)即为\((a_0,a_1)\)之间的宽度,因为\(a_1\)可以挪动到终点即0位置,但是k如果为2,那么\(a_0=0\),即不能挪动到终点位置(挪动到终点则破坏了局面之间的转换,直接使得下一步操作的人获胜)
#include <bits/stdc++.h>
using namespace std;
int n,k;
int a[1010];
int main(){
while(cin>>n>>k){
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
if(k == 1){
puts("Alice");continue;
}
sort(a+1,a+1+n);
int sum = 0;
k == 2 ? a[0] = 0 : a[0] = -1;
for(int i=n;i>=1;i-=2){
sum ^= a[i]-a[i-1]-1;
}
sum ? puts("Alice") : puts("Bob");
}
return 0;
}
HDU-4315 Climbing the Hill的更多相关文章
- HDU 4315 Climbing the Hill (阶梯博弈转尼姆博弈)
Climbing the Hill Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Su ...
- hdu 4315 Climbing the Hill(阶梯博弈转nim博弈)
Climbing the Hill Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu 4315 Climbing the Hill && poj 1704 Georgia and Bob阶梯博弈--尼姆博弈
参考博客 先讲一下Georgia and Bob: 题意: 给你一排球的位置(全部在x轴上操作),你要把他们都移动到0位置,每次至少走一步且不能超过他前面(下标小)的那个球,谁不能操作谁就输了 题解: ...
- HDU 4315 Climbing the Hill(阶梯博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=4315 题意:由上至下有多个格子,最顶端的是山顶,有多个球,其中有一个球是king,每次可以将球向上移动任意个格子 ...
- hdu 4315 Climbing the Hill 博弈论
题意:有n个人爬山,山顶坐标为0,其他人按升序给出,不同的坐标只能容纳一个人(山顶不限),Alice和Bob轮流选择一个人让他移动任意步,但不能越过前面的人,且不能和前面一个人在相同的位置.现在有一个 ...
- HDU 4315 Climbing the Hill [阶梯Nim]
传送门 题意: 和上题基本一样:山顶可以有多人,谁先把king放到山顶谁就胜 并不太明白 #include <iostream> #include <cstdio> #incl ...
- 【hdu 4315】Climbing the Hill
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- HDU 4315 阶梯博弈变形
n个棋子,其中第k个是红色的,每个棋子只能往上爬,而且不能越过.重叠其他棋子,谁将红色棋子移到顶部谁赢. 由于只能往上爬,所以很像阶梯博弈.这题有2个限制,棋子不能重叠,有红棋存在 首先不考虑红色棋, ...
- HDU 4315:Climbing the Hill(阶梯博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=4315 题意:有n个人要往坐标为0的地方移动,他们分别有一个位置a[i],其中最靠近0的第k个人是king,移动的 ...
- hdu 1049 Climbing Worm
解题思路: 1. 两种情况,0x1:井深度小于一次跳的高度.0x2:井深度大于一次跳的高度 2.如果 属于 0x1 则一次跳出 3.否则 本次解题中直接枚举跳的次数 一直循环,直到 [每次跳的真实高度 ...
随机推荐
- Angular入门到精通系列教程(6)- Angular的升级
1. 摘要 2. https://update.angular.io/ 3. 总结 环境: Angular CLI: 11.0.6 Angular: 11.0.7 Node: 12.18.3 npm ...
- 切换用户后whoami打印用户的问题
问题: 为何第二个whoami打印的还是root? root@localhost /]# [root@localhost /]# [root@localhost /]# more test.sh #! ...
- Mac安装Go语言
正文 安装 安装我们使用 HomeBrew ,其使用方法详见我的上一篇博文 brew install go 配置环境变量 Go1.3及以后版本跳过以下步骤 进入变量文件 cd ~ vim .bash_ ...
- 十五:SQL注入之oracle,Mangodb注入
Access,Mysql,mssql,mangoDB,postgresql,sqlite,oracle,sybase JSON类型的数据注入: 键名:键值 {"a":"1 ...
- Python基础语法6-冒泡排序
用for循环实现冒泡排序(升序): array = [3,2,1] for i in range(len(array) - 1, 0, -1): for j in range(0, i): if ...
- maven依赖与传递性依赖
目录 依赖范围 传递性依赖 依赖调节 可选依赖 本文主要是针对<maven实战>书中关键知识点的学习记录,未免有纰漏或描述不到之处,建议购买阅读原书 首先贴出一个pom常见的一些元素释义 ...
- 【ORA】ORA-27101快速处理方法
今天朋友的数据库出了问题,报错如下: 这个问题主要是是spfile和pfile文件不一致导致的, 生成一个pfile,完了用pfile启动数据库即可 SQL> create pfile '/ho ...
- 构造无字母数字Webshell
异或: 补充: A的ascii为65,对应二进制是01000001 <?php echo "1"^"A"; ?> 将"A"和&q ...
- python optparse模块的用法
引用原博主文章链接: https://www.cnblogs.com/darkpig/p/5717902.html
- 入门OJ:亲戚
题目描述 或许你并不知道,你的某个朋友是你的亲戚.他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子.如果能得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代, ...