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.否则 本次解题中直接枚举跳的次数 一直循环,直到 [每次跳的真实高度 ...
随机推荐
- MongoDB按照嵌套数组中的map的某个key无法正常排序的问题
前阵子同事有一个需求: 在一个数组嵌套map的结构中,首先按照map中的某个key进行筛选,再按照map中的某个key进行排序,但是奇怪的是数据总是乱序的. 再检查了代码和数据之后并没有发现什么错误, ...
- 在mapper.xml映射文件中添加中文注释报错
问题描述: 在写mapper.xml文件时,想给操作数据库语句添加一些中文注释,添加后运行报如下错误: 思考 可能是写了中文注释,编译器在解析xml文件时,未能成功转码,从而导致乱码.但是文件开头也采 ...
- MySql创建存储过程,并使用事件定时调用
一.使用命令行创建存储过程的步骤 :参数详情参考 https://www.mysqlzh.com/ 1.模板 delimiter $$ # 设置分隔符为 '$$' ,mysql默认的语句分隔符为 ' ...
- 万万没想到,JVM内存区域的面试题也可以问的这么难?
二.Java内存区域 1.Java内存结构 内存结构 程序计数器 当前线程所执行字节码的行号指示器.若当前方法是native的,那么程序计数器的值就是undefined. 线程私有,Java内存区域中 ...
- Angular入门到精通系列教程(10)- 指令(Directive)
1. 摘要 2. 组件与指令之间的关系 2.1. 指令的种类 3. Angular 中指令的用途 4. 指令举例 4.1. 指令功能 4.2. Anuglar CLI生成基本文件 4.3. Direc ...
- Unity 编辑器(移除missing)
移除 Missing(Mono Script) ` private static void FindMissingReferences() { GameObject[] pAllObjects = ( ...
- 【MyBatis】MyBatis 缓存
MyBatis 缓存 文章源码 什么是缓存 像大多数的持久化框架一样,MyBatis 也提供了缓存策略,通过缓存策略来减少数据库的查询次数,从而提高性能. Mybatis 中缓存分为一级缓存,二级缓存 ...
- Java远程下载文件到本地(http协议和ssh2协议)
Java中java.io包为我们提供了输入流和输出流,对文件的读写基本上都依赖于这些封装好的关于流的类中来实现.前段时间遇到了以下两种需求: 1.与某系统对接,每天获取最新的图片并显示在前端页面.该系 ...
- windows打包脚本出现 /bin/sh^M: 坏的解释器: 没有那个文件或目录 错误
1.错误描述 我在Windows 10 系统下打包dolphinscheduler,上传到centos7解压之后,执行脚本报如下错误: -bash: ./dolphinscheduler-daemon ...
- 求得二叉搜索树的第k小的元素
求得二叉搜索树的第k小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 须知:二叉搜索树,又叫二叉排序树,二叉查找树.特点是:左子树的所有元素都小于等 ...