前言

博弈论,博大精深啊~~
这里就是一个简单博弈论的算法题,典型的入门级别,值得学习。

题目要求

P3150题目链接


分析

我们模拟一下胜负情况:

m=1时:
pb不能分割,所以zs赢了。

m=2时:
pb分割成1+1,对方拿走一份,必定是1。对于剩下的1,zs不能分割,pb赢了。

m=3时:
pb分割成2+1,对方为了续命,只能剩下2,zs对2进行1+1的分割,此时情况回到逆向的m=2,所以zs赢了。

m=4时:
pb有两种选择,3+1或者2+2。
3+1时,zs为了续命,只能剩下3,这是反向的m=3,pb赢了。
2+2时,zs只能剩下2,这是反向的m=2,zs就赢了。
但是pb先手,而且用最优策略,自然会选择3+1方案,就赢了。

m=5时:
pb有两种选择,3+2或者4+1。
3+2时,zs选3就会输,选2就会赢。
4+1时,zs选1就输了,只能选4,然后他会为了胜利进行3+1方案,堵死pb获胜的可能。
所以pb不论作何选择,zs都有将其100%堵死的策略,zs必胜。

m=6时:
pb有三种可能,3+3或者4+2或者5+1。
3+3时,zs只能选3,就是逆向的m=3,pb赢。
4+2时,zs选2就肯定赢,选4的话就能选3+1方案,封死pb获胜可能,这种情况下zs肯定能赢。
5+1时,zs不可能选1,因为会输,必然选5,选5的话,那就反过来了,pb肯定能赢。
所以,pb选择3+3或者5+1方案,避开4+2方案,即可战胜zs,pb有选择权,所以pb赢。

……

越往下分析越复杂,但是我们能发觉规律:
如果m为偶数, 那么先手赢(即pb), 如果m为奇数, 那么后手赢(即zs)。

继续分析:
我们不管先手怎么走,为了所谓“胜利的目标”也好,为了“续命的事实”也好,
只要他手里是奇数,为了胜利,都不得不拆成奇数+偶数。那么后手只要选择偶数,他就可以把这个数化成m = (m-1) + 1(后手的最优策略),把奇数转移给先手。这样经过若干次转移之后, 后手手里一定会是2,然后2 = 1 + 1,后手就赢了。

所以,其实手里是奇数的人是没有胜算的,所以这个状态是必败态。而手里是偶数的人是有必胜的可能的,只有他才有最优策略而且只要他按照最优策略走,他一定会赢,因此这个状态是必胜态。这里我们认为每个人一定能作出对自己当前和全局最有利的决策,所以其实在一开始给出数值的一瞬间,胜负已定。

而理解这个博弈论问题的关键,就是拥有偶数的策略:控制偶数的一方每次减一,给对方两个奇数的选项,因而不论对方怎么切割这个奇数,最终一定会切成奇数+偶数,原先控制偶数的人再选偶数,就可以再次将偶数态(必胜态)转移过来,就一定能一步一步走向胜利。

有位dalao这样总结的这个问题:
其实这里的必败态(不能控制偶数的一方)从来没有最佳策略,博弈也不是双方的博弈,而是处在必胜态的那方和自己博弈。而这场博弈,由于绝顶聪明的前提,是必胜的,而我们要做的,只是找出谁有跟自己博弈的机会。

我觉得这位大佬说的特别对,理解很Nice,OrzOrz……

那代码就很简单啦,这里我简单的用了一下x&1,表示x%2,判断奇偶数用的。

AC代码(Java语言描述)

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();List<String> list = new ArrayList<>();for (int i = 0; i < num; i++) {if ((scanner.nextInt() & 1) == 0) {list.add("pb wins");} else {list.add("zs wins");}}scanner.close();for (String s : list) {System.out.println(s);}}
}

用博弈论的思想玩游戏(洛谷P3150题题解,Java语言描述)相关推荐

  1. 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)

    题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...

  2. 线性存储的最短平均检索时间(洛谷P1253题题解,Java语言描述)

    题目要求 P1253题目链接 分析 很像 ~洛谷P1223题题解~,也是一种类似SJF的贪心法. 排个序,由于两个不大于10000的数,乘起来还是int,就使用int属性吧. 数据量小,所以Scann ...

  3. 利用循环队列的思想进行加密解密(洛谷P1914题题解,Java语言描述)

    前言 在我看来,理解循环队列对我们思考问题的帮助就是: 合理利用"%"的约束,将问题的"越界"重新弹回问题范围内. 本文就是一个例子,循环队列的思想为我快速秒杀 ...

  4. 移动石头游戏中的博弈问题(洛谷P4136题题解,Java语言描述)

    题目要求 P4136题目链接 分析 一道博弈论的题. 很显然,棋盘大小为 n×nn\times nn×n,左上角已有111枚棋子,那么剩下的可选格子有 n2−1n^2-1n2−1 个. 由题意得,如果 ...

  5. 扫雷游戏(洛谷P2670题题解,Java语言描述)

    题目要求 P2670题目链接 分析 本题可以用作简易版扫雷游戏的核心算法Demo,且很好的考察了一些细节. 我们知道,扫雷的地图里有雷格.空白格.数字格.本题没有空白格,空白格相当于数字0格. 这里可 ...

  6. 试试把OJ题意抽象成物理模型(洛谷P1007题题解,Java语言描述)

    题目要求 P1007题目链接 分析 这题干出的,真有毒... 要是有这种指挥官,也是醉了... 言归正传,这题其实是可以贪心求解的,但我们还可以更加666... 事实上,题干上面那一大篇基本在扯,关键 ...

  7. 麦森数(洛谷P1045题题解,Java语言描述)

    题目要求 题目链接 分析 这题挺经典的,快速幂取模算法,如果求出大数再取模就可能T掉. 之前有篇文章写了这个算法:<快速幂算法详解&&快速幂取模算法详解> 既然是Java, ...

  8. 枚举求解单词方阵(洛谷P1101题题解,Java语言描述)

    题目要求 P1101题目链接 分析 可以用DFS做,但我立下了个Flag,所以就用了朴素的枚举来做.... 结果,我的天哪,做了好几个小时-- 其实这种地图题,真的适合 DFS or BFS or D ...

  9. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)

    题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...

最新文章

  1. ThinkPHP5.1接收post、get参数
  2. 25个Linux性能监控工具
  3. mysql gtid 开启失败,master--1.1.3-SNAPSHOT版本,启用GTID,启动失败
  4. ubuntu 升级python3.8_Ubuntu上python升级到最新3.8版
  5. 远程连接 SuSE Linux 设置方法
  6. sorl6.0+jetty+mysql搭建solr服务
  7. 652 Find Duplicate Subtrees
  8. centos6.7环境下kvm虚拟机之virt-install和virsh及virt-manager工具的使用
  9. oracle临时表空间占用率过高,ORACLE临时表空间太大,如何处理?
  10. 增量式解析大型XML文件
  11. 【Pygame系列】《雷霆对决》新版本敌军、玩家个个身怀绝技,火力爆棚~(升级版)
  12. 【学生网页设计作品 】关于HTML公益主题网页设计——谨防电信诈骗网
  13. LANP环境搭建(yum安装)
  14. 软件工程领域权威期刊
  15. Dim Temp%的意思
  16. 【人工智能】Google I/O 2023:让 AI 对每个人都更有帮助 Making AI more helpful for everyone
  17. linux下wifi连接方法
  18. 通证大局观(二):通证权益解析
  19. android 广播震动,android 震动和提示音的实现代码
  20. Golang和HTTPS在网站前端接入里的作用

热门文章

  1. 通通玩blend美工(8)——动态绘制路径动画,画出个萌妹子~
  2. 【前端统计图】echarts实现单条折线图
  3. MediaRecorder录像怎么旋转呀?
  4. 如何关闭父窗体?C#
  5. Java calendar加减时间
  6. 判断select下拉框是否有选,并给下拉框赋值
  7. js删除数组中指定元素_js中数组操作详解
  8. fileitem方法_FileItem的常用方法
  9. xp做打印服务器 找不到驱动,XP系统安装打印机驱动提示找不到指定的模块怎么办...
  10. 差异表达基因变化倍数_10.limma教程|差异表达统计相关理论