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.否则 本次解题中直接枚举跳的次数 一直循环,直到 [每次跳的真实高度 ...
随机推荐
- CentOS 6安装Gitlab
1. 保证CentOS 6能连接网络 . 2.安装依赖: sudo yum install -y curl policycoreutils-python openssh-server cronie s ...
- 利用css和jquery制成弹幕
1.首先上图看下效果 2.废话不多说,直接上代码 1>html代码 <div class="barrage"> <div class="scree ...
- 二 prometheus 监控 Redis
Prometheus 监控Redis需要用到redis_exporter客户端, Prometheus -> redis_exporter这个模式, 类似监控Mysql 一个思路. 1 ) 设置 ...
- wpf 中用 C# 代码创建 PropertyPath ,以对间接目标进行 Storyboard 动画.
如图,一个 Rectangle 一个 Button ,点击按钮时要通过动画完成对 Rectangle填充色的渐变动画. Xaml: 1 <Window 2 x:Class="WpfAp ...
- wpf 在不同DPI下如何在DrawingVisual中画出清晰的图形
环境Win10 VS2017 .Net Framework4.7.1 本文仅讨论在DrawingVisual中进行的画图. WPF单位,系统DPI,显示器DPI三者的定义及关系 WPF单位:一 ...
- 断言封装之key检查及kv实战示例
️️️️️️️️️️️️️️️️️️️️️️️️️️️️️ 测试: 断言处理: demo_04.pyimport jsonjson_obj = {"access_token":&q ...
- for update语句锁机制问题
数据库小知识学习系列 问题: MySQL InnoDB中,select where xxx=123 for update:该xxx没有索引,是使用表锁还是全部数据加行锁? 答: InnoDB引擎(默认 ...
- xray—学习笔记
长亭xray扫描器 简介 xray (https://github.com/chaitin/xray) 是从长亭洞鉴核心引擎中提取出的社区版漏洞扫描神器,支持主动.被动多种扫描方式,自备盲打平台.可以 ...
- 使用CDN访问免备案网站
如何使用CDN绕过服务器域名备案 前言 不得不说,大陆需要备案,时间真的有点长,至少得5天~20天起步,对于我们这些火急火燎的站长还是比较难受的.这里教大家如何使用cdn绕过备案, 访问速度很快,亲测 ...
- [APUE] 文件 I/O
文件操作相关 API:open, read, write, lseek, close. 多进程共享文件的相关 API:dup, dup2, fcntl, sync, fsync, ioctl. 文件操 ...