2021-01-07

博客园Logo
首页
新闻
博问
专区
闪存
班级
代码改变世界
搜索
注册
登录
返回主页
TechFlow2019
博客园首页新随笔联系订阅管理随笔 - 316 文章 - 0 评论 - 227
codeforces 1451D,一道有趣的博弈论问题
大家好,欢迎来到codeforces专题。

今天选择的问题是Contest 1451场的D题,这是一道有趣简单的伪博弈论问题,全场通过的人有3203人。难度不太高,依旧以思维为主,坑不多,非常友好。

题目链接:https://codeforces.com/contest/1451/problem/D

废话不多说,我们直接来看问题。

题意
从前有两个人,一个叫Utkarsh,另外一个叫Ashish。这两个名字看起来有点怪,我猜可能出题人是老毛子的原因,老毛子的问题当中这两个名字经常出现。也许类似于我们的小红、小明这样的名字吧。

这两个人在一个2D的棋盘上玩移动棋子的游戏,一开始从原点出发,Ashish先手。每次可以把棋子向上或者是向右移动k个单位的距离。两人交替移动,游戏规定棋子距离原点的距离必须要小于d。当有人移动不了棋子的时候落败。

现在给出d和k,要求在两人都智商爆表的情况下,谁会获胜。

样例
首先输入一个整数t,表示测试数据的组数。接着输入t行,每行代表一个样例。每一行输入两个整数,分别代表d()和k()。

要求输出胜者的名字。

关于第一个样例的解释:

我们可以发现当两人轮流执行一个回合之后,Ashish一定无路可去,所以胜者是Utkarsh。

题解
一拿到手,我们会很自然地觉得这是一道博弈论的问题。

实际上看起来也非常像,两个人轮流游戏,包括游戏的一些细节,轮流移动,不能移动者落败,都很符合博弈论问题的特征。从博弈论入手的话,我们会想到必败态和必胜态之间的转化。

我们进一步分析的话,也不难想到思路。我们把这个平面想象成一个用一个扇形笼罩的区域,对于靠近扇形边境上的点,只有我们知道了坐标,就可以计算出来从原点出发到达这里需要的步数,步数知道了自然也就知道了最终是哪一个人落在了这个点。

这样我们首先确定下来边境的胜负状况之后,我们就可以逐渐往内层倒推,最终求解出原点的状态。这个推导的转移非常容易想明白,对于每个点来说它最多只有向右和向上两条路,对于该点做决策的人来说,只要这两个决策当中有一个能够到达自己的必胜态,那么该点自然也是必胜态。这其实有点动态规划的思想了,通过这种方法,我们可以求解出平面上每一个能够达到的点的状态。

看似这个问题就已经做完了,非常简单,但是我们稍微分析一下就会发现这样是不行的。道理也很简单,因为复杂度太大,会超时。

极端情况下当d的量级是1e5,并且k=1的时候,我们需要考虑的点的数量应该在1e10这个量级,这显然是不能接受的。那除了这个办法之外还有其他方法可行吗?

很多时候看似问题很难解决,往往是我们走错了路。我们一直想着怎么递推,怎么获取每个点的状态,其实一开始这个思路就错了。这个时候需要我们把这些念头放一放,回归到问题本身。

我们把自己代入先手的玩家,我们会想出什么策略?你会发现好像一时半会也没什么特别好的策略?但如果我们是后手玩家呢?你会发现好的策略可能没有,但是赖皮的套路却是存在的。因为这个扇形是一个四分之一圆,它是对称的。所以我们可以利用后发的优势镜像先手的行动,先手往上我们往右,先手往右我们往上,这样我们可以保证我们的点始终落在斜对角线。这样只要先手可以前进,那么后手就一定可以移动。也就是顺着下图的路线移动。

那这样岂不是先手必输吗?其实也不是的,也有例外。就是当后手无法回到斜线的时候,也就是说((x+1)k, xk)距离原点小于d,而((x+1)k, (x+1)k)大于d的时候。

这样我们就可以很方便写出代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include “time.h”
#include
#define rep(i,a,b) for (int i=a;i<b;i++)
#define Rep(i,a,b) for (int i=a;i>b;i–)
#define foreach(e,x) for (__typeof(x.begin()) e=x.begin();e!=x.end();e++)
#define mid ((l+r)>>1)
#define lson (k<<1)
#define rson (k<<1|1)
#define MEM(a,x) memset(a,x,sizeof a)
#define L ch[r][0]
#define R ch[r][1]
const int N=1000050;
const long long Mod=1000000007;

using namespace std;

int main() {
int t;
scanf("%d", &t);
rep(z, 0, t) {
long long d, k;
scanf("%lld%lld", &d, &k);
int n = d / (sqrt(2) * k);
long long x = (n+1) * k;
long long y = n * k;
// 判断是否会出现((x+1)k, xk)可行的情况
if (x * x + y * y > d * d) {
puts(“Utkarsh”);
}else {
puts(“Ashish”);
}
}
return 0;
}
这里有一个小小的坑,就是由于d的范围是1e5,那么当我们计算距离的时候由于用到平方会超过int的范围,所以需要改成long long。

这道题到这里就结束了,我们也可以看得出来,题目本身是不难的,但是解法没有那么容易想到。我个人觉得挺有意思的,希望大家也会喜欢。

今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发)

标签: 算法, 数据结构, 博弈论, codeforces
好文要顶 关注我 收藏该文
TechFlow2019
关注 - 0
粉丝 - 202
+加关注
00
« 上一篇: 剑气之争,聊聊算法岗位的门户之见!
posted @ 2021-01-07 09:13 TechFlow2019 阅读(12) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】有你助力,更好为你——博客园用户消费观调查,附带小惊喜!
【推荐】AWS携手博客园为开发者送福利,注册立享12个月免费套餐
【推荐】七牛云新老用户同享 1 分钱抢 CDN 1TB流量大礼包!
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【推荐】新一代 NoSQL 数据库,Aerospike专区新鲜入驻

相关博文:
· CodeForces - 955B
· Codeforces 1260
· CodeForces 796D
· Codeforces 1278D
· Codeforces 1281E
» 更多推荐…

最新 IT 新闻:
· 互联网新巨头二号位简史
· BAT移动生态战争2021:对生态的研究和发力成为重中之重
· 《绝地求生》续作或正在开发 登陆PC/主机/移动端
· 特斯拉与BBA,必有一战
· 一线|瑞幸郭谨一回应被“逼宫”:举报信是陆正耀等起草,当事员工不知情
» 更多新闻…
历史上的今天:
2020-01-07 线性代数精华——讲透矩阵的初等变换与矩阵的秩
公告
日拱一卒,功不唐捐

欢迎关注我的公众号:TechFlow

昵称: TechFlow2019
园龄: 1年
粉丝: 202
关注: 0
+加关注
< 2021年1月 >
日 一 二 三 四 五 六
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6
搜索

常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
算法(100)
LeetCode(58)
机器学习基础(53)
python(46)
数据结构(41)
Python基础(20)
git(16)
go语言(14)
高等数学(14)
git教程(13)
更多
随笔分类
Go(15)
LeetCode题解(53)
Python(37)
spark(6)
大数据与分布式(10)
机器学习(45)
其他(2)
数学基础(16)
算法与数据结构(48)
随笔档案
2021年1月(7)
2020年12月(17)
2020年11月(18)
2020年10月(22)
2020年9月(21)
2020年8月(22)
2020年7月(22)
2020年6月(29)
2020年5月(31)
2020年4月(36)
2020年3月(32)
2020年2月(28)
2020年1月(23)
2019年12月(8)
最新评论

  1. Re:剑气之争,聊聊算法岗位的门户之见!
    实践派解决了实际应用问题,由于没有高大上的算法,故不方便吹B,就水不了Paper。学院派为了Paper而Paper,大部分想法虽有一定参考性,实践指望它就要吃亏。

–lileishihaoren
2. Re:剑气之争,聊聊算法岗位的门户之见!
不错,感谢分享

–立志做一个好的程序员
3. Re:80%学生的困惑,学完C/C++之后学什么?
C#

–天才卧龙
4. Re:80%学生的困惑,学完C/C++之后学什么?
假设标题是准确的:“80%学生的困惑,学完C/C之后学什么?” 那么,我理解为: 80%的学生在学完C/C后不知该干啥,是因为他们还没有修完这门课程。他们所学到的只是入门基础,还需要继续努力学习。继续…
–blogger2020
5. Re:80%学生的困惑,学完C/C++之后学什么?
C++你还想学完?

–ink19
阅读排行榜

  1. 大数据算法——布隆过滤器(11256)
  2. 在vscode中配置LeetCode插件,从此愉快地刷题(7529)
  3. 概率统计——三扇门游戏与贝叶斯定理(3984)
  4. 一半人写不出冒泡排序,你的同龄人都躺下了(3759)
  5. MySQL不香吗,为什么还要有noSQL?(3530)
    评论排行榜
  6. 80%的学校还在给新生上C语言,它们OUT了吗?(31)
  7. 一半人写不出冒泡排序,你的同龄人都躺下了(31)
  8. 大数据算法——布隆过滤器(29)
  9. MySQL不香吗,为什么还要有noSQL?(14)
  10. 随机数大家都会用,但是你知道生成随机数的算法吗?(9)
    推荐排行榜
  11. 大数据算法——布隆过滤器(45)
  12. MySQL不香吗,为什么还要有noSQL?(20)
  13. 一半人写不出冒泡排序,你的同龄人都躺下了(17)
  14. 从头搭建一个“微博”有多难(14)
  15. 80%的学校还在给新生上C语言,它们OUT了吗?(10)
    Copyright © 2021 TechFlow2019
    Powered by .NET 5.0 on Kubernetes
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值