math-2人博弈
问题描述:
100根火柴,2人轮流取,每人每次只能取1-7根,取走最后一根火柴的人获胜。问有没有一种策略肯定能够获胜?该策略具体:先取or后取,怎么取?
思维过程:
step1:题目问的很明显,所以肯定是有一种方法能够获胜的,因为自己读题时对“先取还是后取”字眼比较关注,且由于先取,不能保证另一方取完后的数量,所以假设为后取(这个假设算是一个坑吧)
step2:问题肯定存在某种规律,我认为是2人每一回合取的火柴数。2人轮流取,后取的肯定能够保证这一轮总数为8,>8的数是不可能的了。
step3:每一回合按照step2中的这样取,最后还剩4根。当时自己怎么都绕不过来这四根应该怎么办,然后就开始动摇是不是不应该每次使得总和为8,如果不保持这个数的话,取的数就会乱套,也不行(PS:愣是没有想到推翻假设)
step4:实在不行了,就开始从结局开始往前推,假设2人都是明白道理的话,最后一局肯定是8根,再往前推一局,推推推……发现不行啊,100根太多了。就以10根为例推,还是有点乱。
step5:最后还是觉得之前保持8根的想法是对的,就从100根倒着减8,减了几次,恍然大悟,可以先取4根,后面就能够保持平衡了……
结果:
先取,第一次取4根,后面只要与另一个人在同一回合相加为8就ok.
(不过刚刚又想到其实后取也是可以的,只要在中途多取几根,多取的总数为4也行,(如果前面的人永远取1根,那第一轮的时候取3根也能凑4)hahha,这个解决方法是刚刚写的时候想到的!)
总结:
要记得自己假设了什么,有时候推翻假设是关键
——————————————————————————————————————————————————————————————
推广:
有两堆水果,数量分别为m,n。2人轮流取,每次只能在一堆水果中取,每次可以取1~这堆水果的总量。取走最后一个水果的人获胜。问:同上。
思维过程:
step1:假设每次都尽可能赢,最后一局的时候,结果为2堆各剩余1个。那么就可以把两堆分成4堆,即两堆中的1个不拿,问题可以转换为谁正好拿完剩余的那些,那么他就是赢的。转化后的问题跟原问题一样了,即两堆中的2个不拿,谁拿完剩余的那些,那么他就是赢家。如果一直往前推的话,到第三次转换的时候就出现问题了,即剩余3个不拿,谁拿完剩余的那些,谁就是赢家(我是到这一步才明白不能递推)。因为他可以直接拿到只剩一个,所以这种每堆只剩3个的情况可以是不存在的。综上,只有两堆都只剩1个,这种情况才是肯定会存在的(在第一句假设上)。(找确定情况)
step2:往后递推的方式不行,就考虑了此题与上一题的区别,很明显的一点就是,拿的个数放宽了,所以每次拿完之后情况复杂,不能看出规律来。
step3:这时候,我采用了特例的方法,假设每次每个人只拿一个,分析先拿和后拿的情况,发现跟m+n的奇偶性有关。但是推翻这个假设又想不通了。又将个数实例化,且去比较小的值,但是情况也是乱七八糟的。然后就放弃这个方法了。
step4:直觉上觉得应该还是应该从后面固定的局面(即两堆各剩下1个)往前推。感觉也是有点漫无目的想。可以说是自己模拟情况,也没有什么进展。
step5:然后在睡觉前又想了一会,又有点跳回到step1中的想法,后来猛然惊醒,忽然想每次只要跟对方拿的一样就行了啊。然后有修正了一下,感觉只要每一回合之后,两堆剩余的个数一样就可以了,只要谁能够在其这一次拿完之后使得两堆剩余一样就可以了。考虑先拿后拿的问题,由于上一题的经验,可以说先后其实是相对的,所以觉得先后无关,但是仔细想想就发现,m≠n是,为了保证能够获胜,先拿使得两堆数量相同,才能自己赢,因为如果后拿,先拿的人知道这个规律,那么你是不可能使得两堆相等的。(感觉“忽然顿悟”这一点实在是难以琢磨,不知道为何自己忽然就知道了,不过现在想想,可能也跟step1中的递推有关系,因为当时就发现如果这样下去,每次两堆剩下的数量都是一样的。这应该也算是线索之一吧)
结果:
先拿,每次拿完之后只要保证两堆数量相等即可。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总结:
虽然题目看上去差不多,中间也用了一些相同的办法去做,但是感觉到第一问题还是有迹可循的,第二问题就有点靠联想而不是推理或者是逻辑演练了。
相同点:思路都是从题目中反推出结果成立需要满足的情况,再由这个确定的情况出发,联想或者推理。
不同点:问1规律明显,问2规律不明显(甚至我都觉得自己找不到规律啊)
math-2人博弈的更多相关文章
- POJ 1704 Georgia and Bob(阶梯博弈)题解
题意:有一个一维棋盘,有格子标号1,2,3,......有n个棋子放在一些格子上,两人博弈,只能将棋子向左移,不能和其他棋子重叠,也不能跨越其他棋子,不能超越边界,不能走的人输 思路:可以用阶梯博弈来 ...
- hdu1525 Euclid's Game , 基础博弈
http://acm.hdu.edu.cn/showproblem.php?pid=1525 题意: 两人博弈,给出两个数a和b, 较大数减去较小数的随意倍数.结果不能小于0,将两个数随意一个数减到0 ...
- Educational Codeforces Round 68 (Rated for Div. 2) D. 1-2-K Game (博弈, sg函数,规律)
D. 1-2-K Game time limit per test2 seconds memory limit per test256 megabytes inputstandard input ou ...
- 【HDU】1846 Brave Game
http://acm.hdu.edu.cn/showproblem.php?pid=1846 题意:二人博弈,1堆石子每次取1~m个,没有石子可取的输,输出先手胜利还是后手胜利. #include & ...
- 每周一道数据结构(四)A*算法&博弈树α-β剪枝
A*算法/博弈树 前阵子考试学了A*算法.博弈树和回溯,自己真是愚蠢至极,根本没就搞明白这些,所以对于这些算法问道的话就不能说清楚,也记不住,所以才有了这篇笔记.在这里感谢面试我的那位工程师~~ A* ...
- A*算法&博弈树α-β剪枝
A*算法&博弈树α-β剪枝 A*算法/博弈树 前阵子考试学了A*算法.博弈树和回溯,自己真是愚蠢至极,根本没就搞明白这些,所以对于这些算法问道的话就不能说清楚,也记不住,所以才有了这篇笔记.在 ...
- 学习笔记TF051:生成式对抗网络
生成式对抗网络(gennerative adversarial network,GAN),谷歌2014年提出网络模型.灵感自二人博弈的零和博弈,目前最火的非监督深度学习.GAN之父,Ian J.Goo ...
- canvas 从初级到XX 2# 让我们在之前的基础之上,再迈进一步吧 [中级向] (上)
还是老样子,先啰嗦一点前言. 最近各种事务缠身,所以也就隔了比较长的时间才开始码这篇文.希望不会这么快就过气. 好了,接下来就开始码代码.(写到中途,突然感觉到的.本篇设计大量初中物理知识,请怀念的往 ...
- 浅谈博弈论中的两个基本模型——Bash Game&&Nim Game
最近在数学这一块搞了蛮多题目,已经解决了数论基础,线性代数(只有矩阵,行列式待坑),组合数学中的一些简单问题.所以接下来不可避免的对博弈论这一哲学大坑开工. 当然,由于我很菜,所以也只能从最基础最容易 ...
随机推荐
- Centos7.2(linux)minimal install之后需要的操作
minimal install之后,很多命令都不存在,例如ifconfig, wget等等 首先,需要先配置网络,保证机器可以连上互联纲 ip addr可以查看网卡的基本信息 一般默认就只有两个,一个 ...
- "做中学"之“极客时间”课程学习指导
目录 "做中学"之"极客时间"课程学习指导 所有课程都可以选的课程 Java程序设计 移动平台开发 网络攻防实践 信息安全系统设计基础 信息安全专业导论 极客时 ...
- SSM-网站前台博客系统制作(1)---前台+Google的Kaptcha
前提: 1天半时间简单自己手写了一下前端布局和后台验证码的基本工作,简要说明一下遇到的问题和收获吧. 这次基本就是前台设计(首页)+Kaptcha图片验证码(之前弄了一个reCaptcha验证码 但是 ...
- JS高程关于ajax的学习笔记
1.ajax介绍 ajax技术可以实现浏览器向服务器请求数据时不需要重新加载页面,就可以从服务器中获取需要的数据. ajax技术的核心是XMLHttpRequest对象(简称XHR),XHR对象为向服 ...
- 【NOIP2015普及组】推销员_详解
题目 题目大意 阿明是一名推销员--螺丝街是一条直线,一端有入口,一共有 \(N(<100,000)\) 家住户,第 \(i\) 家住户到入口的距离为 \(S_i\) 米.由于同一栋房子里可以有 ...
- C# Finalize和Dispose的区别
一:总结 1.Finalize方法(C#中是析构函数,以下称析构函数)是用于释放非托管资源的,而托管资源会由GC自动回收.所以,我们也可以这样来区分 托管和非托管资源.所有会由GC自动回收的资源,就是 ...
- Vue-admin工作整理(十): Vuex-Actions(模拟接口请求实现组件字段更新)
思路:通过提交一个 mutation,而不是直接变更状态,它可以包括异步操作,通过请求接口,定义一个方法,第一个参数为对象,在里面能够提取到一些东西,比如:commit,这是一个方法,调用这个comm ...
- Unity3d外包团队:Unity3d最新版本更新内容
GPU Instancing Improvement 只能改进了一些功能吧,原GPU Instancing shader可参考 https://docs.unity3d.com/Manual/GPUI ...
- 数据拆分之 垂直拆分 and 水平拆分
https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247488833&idx=1&sn=4f5fe577521431 ...
- JS-getHours()方法
var time=new Date().getHours(); 获取当前系统时间的小时值,eg:若当前系统时间为2019.4.25 10:52 则返回10