【题目链接】

ybt 1218:取石子游戏
OpenJudge NOI 2.5 6266:取石子游戏

【题目考点】

1. 博弈:完全信息博弈

博弈树:
博弈树的结点对应于某一个棋局,其分支表示走一步棋;根部对应于开始位置,其叶表示对弈到此结束。在叶节点对应的棋局中,竞赛的结果可以是赢、输或者和局 。
如果该博弈为完全信息博弈,那么博弈双方都清楚整个博弈树,那么该游戏在开始前即可确定先手必胜/必败/或最好情况只能是平局。
博弈树的每一个结点有三种标识:w(对应于赢)、d(对应于和局)或者l(对应于输)。
如果当前的棋局是标有w的,那么此时先手有必胜策略。如果结点标识为d,那么除非对手失误,否则先手最好的情况也只能达成和局;如果结点标识为l ,那么无论先手如何下,对手都有必胜策略。
确定各结点标识的方法如下:
首先,叶子结点标识棋局结束,可以很多容易地判定叶子结点的标识。
如果该结点的子结点都是w,那么说明自己走一步棋后,对手总有必胜策略,那本结点对应的棋局先手必输,标记为l。
如果该结点的子结点存在l,那么自己走一步棋后,棋局变为标记为l的结点,对手输,自己胜。所以本结点标记为w。
如果该结点的子结点不存在l,但存在d,那么自己走一步棋后,棋局变为标记为d的结点,可以争取到平局,本结点标记为d。
按此方法标记每个结点。
如果根结点标记为w,那么先手有必胜策略。如果根结点标记为l,那么后手有必胜策略。如果根结点标记为d,那么先手有至少达到和局的策略。

【解题思路】

1. 建立博弈树

两堆石子数目确定后,构成一种棋局,在双方都不犯错误的情况下,先手必胜或必败。
根据题意,画出测试用例对应的博弈树:

先画出剩下两堆石子个数可能的变化,再确定标记。
在(2,10)时,此时先手可以做到在10中拿2的5倍,将第2堆拿完,取得胜利,所以此处标记为w。(2,10)的父结点(10,12)自然为l。而(10,12)的父结点自然为w。
对于输入(15,24),可以得到博弈树:

进而得知先手必输。

2. 证明题目中的提示

证明:如果⌊ab⌋<2\lfloor \frac{a}{b} \rfloor < 2⌊ba​⌋<2,那么先手只有唯一的一种取法。

此时a < 2b,唯一的一种取法为:在a中取走b,剩下的两堆石子为(a-b, b),而且a-b < b。

证明:假设石子数目为(a,b)且a≥ba \ge ba≥b,如果⌊ab⌋≥2\lfloor \frac{a}{b} \rfloor \ge 2⌊ba​⌋≥2则先手必胜。

证明:因为⌊ab⌋≥2\lfloor \frac{a}{b} \rfloor \ge 2⌊ba​⌋≥2,记x=⌊ab⌋x=\lfloor \frac{a}{b} \rfloorx=⌊ba​⌋,那么一定存在x≥1x \ge 1x≥1,使得ab−1<x≤ab⇒0≤a−xb<b\frac{a}{b}-1< x \le \frac{a}{b}\Rightarrow 0\le a-xb< bba​−1<x≤ba​⇒0≤a−xb<b,因此也有:b≤a−(x−1)b<2bb\le a-(x-1)b<2bb≤a−(x−1)b<2b
因此至少存在以下两种取石子方案:

  • 方案1:a中取走xb,剩下两堆石子为:(a-xb, b)
  • 方案2:a中取走(x-1)b,剩下两堆石子为:(a-(x-1)b, b)
  1. 如果情况(a-xb, b)的标记为w(即先手必胜),那么本轮本方采用方案2,对手遇到的情况为(a-(x-1)b, b),而b≤a−(x−1)b<2bb\le a-(x-1)b<2bb≤a−(x−1)b<2b,亦即⌊a−(x−1)bb⌋<2\lfloor\frac{a-(x-1)b}{b} \rfloor < 2⌊ba−(x−1)b​⌋<2,根据第1点的证明可知此时对手只有一种取法,也就是在a-(x-1)b中取走b,得到两堆石子为(a-xb, b),本方面对的情况为(a-xb, b)是w标记的情况,本方先手必胜。
  2. 如果(a-xb, b)的标记为l(即先手必输),那么本轮本方采用方案1,得到(a-xb,b),对手面对(a-xb,b)情况必败,本方必胜。

综上,在⌊ab⌋≥2\lfloor \frac{a}{b} \rfloor \ge 2⌊ba​⌋≥2时先手必胜。

3. 编码

设递归函数bool dfs(int a, int b),意为当两堆石子分别是(a,b),且a≥ba\ge ba≥b,时先手是否必胜。

  • 如果当前两堆石子a是b的倍数,那么先手可以直接拿光a,本轮先手必胜。
  • ⌊ab⌋≥2\lfloor \frac{a}{b} \rfloor \ge 2⌊ba​⌋≥2即整除运算a/b >= 2,那么本轮先手必胜。
  • 否则本轮只能有一种取法,就是在a中取走b,剩下两堆石子为(b, a-b),其中b≥a−bb \ge a-bb≥a−b。下一轮先手必胜的情况为dfs(b, a-b),如果下一轮先手必胜,那么本轮先手必败。如果下一轮先手必败,那么本轮先手必胜。所以下一轮的先手必胜情况与本轮相反,所以本轮的先手必胜情况为!dfs(b, a-b)

【题解代码】

解法1:博弈 递归

#include <bits/stdc++.h>
using namespace std;
bool dfs(int a, int b)//a:较多一堆石子的数量 b:较少一堆石子的数量  返回:此时是否先手必胜
{if(a%b == 0)return true;//一堆是另一堆的整数倍,此时先手一定可以拿光一堆获得胜利。if(a/b >= 2)//如果floor(a/b)>=2,那么先手必胜 return true;elsereturn !dfs(b, a-b);//下一轮先手是否必胜的情况为dfs(b, a-b),本轮先手的获胜情况与之相反。
}
int main()
{int a, b;while(cin >> a >> b){if(a == 0 && b == 0)break;if(a < b)swap(a, b);//保证a较大,b较小 cout << (dfs(a, b) ? "win" : "lose") << endl;}return 0;
}

信息学奥赛一本通 1218:取石子游戏 | OpenJudge NOI 2.5 6266:取石子游戏相关推荐

  1. 信息学奥赛一本通 1209:分数求和 | OpenJudge NOI 1.13 12:分数求和

    [题目链接] ybt 1209:分数求和 OpenJudge NOI 1.13 12:分数求和 [题目考点] 1. 求最大公约数 2. 求最小公倍数 [解题思路] 求最大公约数,可以用辗转相除法.具体 ...

  2. 信息学奥赛一本通 1294:Charm Bracelet | OpenJudge NOI 2.6 7113:Charm Bracelet | 洛谷 P2871

    [题目链接] ybt 1294:Charm Bracelet OpenJudge NOI 2.6 7113:Charm Bracelet 洛谷 P2871 [USACO07DEC]Charm Brac ...

  3. 信息学奥赛一本通 1185:单词排序 | OpenJudge NOI 1.10 10:单词排序

    [题目链接] ybt 1185:单词排序 OpenJudge NOI 1.10 10:单词排序 [题目考点] 1. 排序 [君义精讲]排序算法 2. 字符串比较 字符数组比较: char s1[N], ...

  4. 信息学奥赛一本通 1412:二进制分类 | OpenJudge NOI 1.13 36:二进制分类

    [题目链接] ybt 1412:二进制分类 OpenJudge NOI 1.13 36:二进制分类 本题为:NOIP1995复赛 普及组 第三题 [题目考点] 1. 数制 2. 函数 [解题思路] 设 ...

  5. 信息学奥赛一本通 1173:阶乘和 | OpenJudge NOI 1.6 15 | 洛谷 P1009 [NOIP1998 普及组] 阶乘之和

    [题目链接] ybt 1173:阶乘和 注:一本通上这题,应该把n≤50n\le50n≤50当做n≤100n\le100n≤100来看 OpenJudge NOI 1.6 15:阶乘和 洛谷 P100 ...

  6. 信息学奥赛一本通 1136:密码翻译 | OpenJudge NOI 1.7 09

    [题目链接] ybt 1136:密码翻译 OpenJudge NOI 1.7 09:密码翻译 [题目考点] 1. 字符串处理 2. ASCII码 [解题思路] 思路1:用判断语句 读入字符串,如果字符 ...

  7. 信息学奥赛一本通 1128:图像模糊处理 | OpenJudge NOI 1.8 13:图像模糊处理

    [题目链接] ybt 1128:图像模糊处理 OpenJudge NOI 1.8 13:图像模糊处理 [题目考点] 1. 二维数组 2. 四舍五入取整函数 <cmath>中的函数: dou ...

  8. 信息学奥赛一本通 1075:药房管理 | OpenJudge NOI 1.5 23:药房管理

    [题目链接] ybt 1075:药房管理 OpenJudge NOI 1.5 23:药房管理 [题目考点] 1. 循环.判断 [解题思路] 设置变量r表示药房剩余药品数量,设f表示没取上药的人数 每次 ...

  9. 信息学奥赛一本通 1036:A×B问题 | OpenJudge NOI 1.3 19

    [题目链接] ybt 1036:A×B问题 OpenJudge NOI 1.3 19:A*B问题 [题目考点] 1. 不同整型数据的范围 类型 占用字节数 可表示数字范围 char 1 -127~12 ...

最新文章

  1. 陆奇激动地对世界说,百度就是中国的谷歌
  2. 《LeetCode力扣练习》剑指 Offer 10- II. 青蛙跳台阶问题 Java
  3. ADO.NET Entity Framework如何:通过每种类型一个表继承以定义模型(实体框架)
  4. MySql第几行到第几行语句
  5. 五分钟学会使用 go modules(含在家办公使用技巧)
  6. 语言主程序和子程序的写法_汇编语言程序设计第三篇——汇编程序结构
  7. 阿里云服务器邮件发送
  8. 【kibana】kibana node 监控指标 详解
  9. BZOJ2440 [中山市选2011]完全平方数
  10. 矩阵分析 (一) 线性空间和线性变换
  11. 手机号码正则_中国大陆手机号码的正则表达式总结ChinaMobilePhoneNumberRegex
  12. 使用websocket实现协同编辑
  13. 老毛桃 固态硬盘 系统迁移
  14. 穷和尚与富和尚的故事
  15. linux网卡配子接口,linux 内核学习(2).
  16. [4G5G专题-109]:部署 - LTE RF射频优化的流程、原因综合分析、解决办法大全
  17. 华为云与阿里云简要区别
  18. linux下查看本机IP的两种方法
  19. Nvidia-smi简介
  20. 先做接口测试还是功能测试

热门文章

  1. 锐捷交换机的端口配置状态
  2. 2019届浦发银行笔试面试经验总结
  3. [CS131] Lecture 1 Course Introduction课程介绍
  4. 数据结构与算法(一)
  5. 奶奶看了都会系列:Python3 IDE环境安装
  6. Java+Swing+mysql学生信息管理系统
  7. 热学仿真模型助力深层次理解半导体器件物理和优化制备工艺
  8. 【数智化案例展】中联教育——嵌入式BI助力财经数据分析教学与服务
  9. python弹出滑块怎么验证_selenium 处理滑块验证的重点
  10. 微信ipad协议破解,仅仅提供思路,如有侵权请告知删除