除数博弈
时间:2022-07-24
本文章向大家介绍除数博弈,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
除数博弈
爱丽丝和鲍勃一起玩游戏,他们轮流行动,爱丽丝先手开局。
最初,黑板上有一个数字N
,在每个玩家的回合,玩家需要执行以下操作:
- 选出任一
x
,满足0 < x < N
且N % x == 0
。 - 用
N - x
替换黑板上的数字N
。
如果玩家无法执行这些操作,就会输掉游戏。
只有在爱丽丝在游戏中取得胜利时才返回true
,否则返回false
,假设两个玩家都以最佳状态参与游戏。
示例
输入:2
输出:true
解释:爱丽丝选择 1,鲍勃无法进行操作。
输入:3
输出:false
解释:爱丽丝选择 1,鲍勃也选择 1,然后爱丽丝无法进行操作。
题解
/**
* @param {number} N
* @return {boolean}
*/
var divisorGame = function(n) {
return n & 1 ? false : true;
};
思路
理解一下题意,查看了输入输出示例,推断这是一个通过判断奇偶性决定胜负的游戏。 这里引用官方推论:博弈类的问题常常让我们摸不着头脑。当我们没有解题思路的时候,不妨试着写几项试试:
-
N = 1
的时候,区间(0, 1)
中没有整数是 n的因数,所以此时Alice
败。 -
N = 2
的时候,Alice
只能拿1
,N
变成1
,Bob
无法继续操作,故Alice
胜。 -
N = 3
的时候,Alice
只能拿1
,N
变成2
,根据N = 2
的结论,我们知道此时Bob
会获胜,Alice
败。 -
N = 4
的时候,Alice
能拿1
或2
,如果Alice
拿1
,根据N = 3
的结论,Bob
会失败,Alice
会获胜。 -
N = 5
的时候,Alice
只能拿11
,根据N = 4
的结论,Alice
会失败。 ......
写到这里,也许你有了一些猜想。没关系,请大胆地猜想,在这种情况下大胆地猜想是AC
的第一步。也许你会发现这样一个现象:N
为奇数的时候Alice
(先手)必败,N
为偶数的时候 Alice
必胜。 这个猜想是否正确呢?下面我们来想办法证明它。
证明:N = 1
和N = 2
时结论成立。
N > 2
时,假设N ≤ k
时该结论成立,则N = k + 1
时,如果k
为偶数,则k + 1
为奇数,x
是k + 1
的因数,只可能是奇数,而奇数减去奇数等于偶数,且k+1−x≤k
,故轮到Bob
的时候都是偶数。而根据我们的猜想假设N≤k
的时候偶数的时候先手必胜,故此时无论Alice
拿走什么,Bob
都会处于必胜态,所以Alice
处于必败态。如果kk
为奇数,则k + 1
为偶数,x
可以是奇数也可以是偶数,若Alice
减去一个奇数,那么k+1−x
是一个小于等于k
的奇数,此时Bob
占有它,处于必败态,则Alice
处于必胜态。综上所述,这个猜想是正确的。
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://leetcode-cn.com/problems/divisor-game
- Mesos+Zookeeper+Marathon的Docker管理平台部署记录(2)--负载均衡marathon-lb
- Docker集群管理工具-Kubernetes部署记录
- AS3:小游戏“贪吃蛇”的实现
- 超实用的8个Linux命令行性能监测工具
- 用javascript替换URL中的参数值
- Gitblit版本服务器环境部署记录
- HDK扩展自定义VEX函数print
- AsyncTask和Handler对比
- sql初始化XML操作
- 给你一根杠杆,撬起万亿的小程序红利市场!
- Flash/Flex学习笔记(43):动量守恒与能量守恒
- Flash/Flex学习笔记(57):实用技巧
- 使用 MEF 轻松实现云部署
- 检测常见ASP.NET配置安全漏洞
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java后端面试学习知识总结——JVM
- Spring JDBC 框架,我的学习笔记
- 磁盘扩容
- 如何在MySQL中创建存储过程
- 磁盘扩容
- PyCharm安装疯狂打字机插件
- Java Lombok 常用注解
- Python 基础 安装 简单的输入输出 运行一个py程序
- Python 基础 数据类型 变量常量
- Java 快速排序 关于起始方向的选择问题 为什么一定要从右边开始
- Java 使用异或进行数组元素交换时的坑 返回0的原因
- Spring BindingResult获取不到结果可能的原因之一 参数顺序 没有紧挨着校验参数
- 残差收缩网络:一种深度学习故障诊断算法
- Solr学习笔记 - 关于近实时搜索
- Solr学习笔记 - 关于timeAllowed