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.否则 本次解题中直接枚举跳的次数 一直循环,直到 [每次跳的真实高度 ...
随机推荐
- netty服务端客户端启动流程分析
服务端启动流程 我们回顾前面讲解的netty启动流程,服务端这边有两个EventLoopGroup,一个专门用来处理连接,一个用来处理后续的io事件 服务端启动还是跟nio一样,绑定端口进行监听,我们 ...
- 第9章 集合处理(数组、Map、Set)
目录 1. 数组 1.1 创建数组 1.2 在数组两端添加删除元素 1.3 在数组任意位置添加.删除元素 delete删除数组元素无效 使用splice方法增.删.改元素 1.4 数组的常用操作 数组 ...
- Nginx+FFmpeg实现RTSP转RTMP
RTSP转RTMP 本次转流采用Centos+Nginx+FFmpeg实现,具体实现如下: 1. 安装Ngxin 安装详细略(可以选择安装阿里的Tengine,官方[下载路径](Download - ...
- 【ORA】ORA-32004: 问题分析和解决
今天做一个特殊的实验,需要重启数据库 数据库关闭没有问题 SQL> shutdown immediate; Database closed. Database dismounted. ORACL ...
- 腾讯云COS对象存储占据数据容灾C位
说到公有云容灾,大家首先想到的是云上数据备份. 然而,随着企业核心业务逐渐从线下迁移到云上,客户提出了更高的要求.如何确保云上业务的高可用.数据的高可靠,这对云厂商提出了新的挑战. 腾讯云作为全球领先 ...
- Java高并发与多线程(四)-----锁
今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...
- Spring 是如何解决循环依赖的?
前言 相信很多小伙伴在工作中都会遇到循环依赖,不过大多数它是这样显示的: 还会提示这么一句: Requested bean is currently in creation: Is there an ...
- Java 给Word不同页面设置不同背景
Word文档中,可直接通过[设计]-[页面颜色]页面颜色,通过Java代码可参考如下设置方法: 1. 设置单一颜色背景 doc.getBackground().setType(BackgroundTy ...
- 记录list.remove()和list.pop()
list.remove(obj):这个是移除列表中某个值的第一个匹配项 list.pop(index):这个是移除列表中下标为index的元素 当元素全是数字或者有数字时注意区分.
- 对于Spring MVC 拦截器的一些了解
Spring MVC 拦截器的执行顺序 应用场景 假设请求 localhost:8080/ 则要求直接重定向到 localhost:8080/login ; 定义拦截器顺序 permission lo ...