小明的游戏(博弈论)
目录
1.小明的游戏1(尼姆博弈)
2.小明的游戏5( 威佐夫游戏)
3.巴什游戏
4.石子游戏
5.取球游戏
1.小明的游戏1(尼姆博弈)
题目描述
蓝桥公司给他们的员工准备了丰厚的奖金,公司主管小明并不希望发太多的奖金,他想把奖金留给智慧的人,于是他决定跟每一个员工玩一个游戏,规则如下:
- 桌面上一共有 n 堆一元钱。
- 双方轮流行动,由小明先行动,每次行动从某一堆钱中拿走若干元(至少一元钱),取走最后一元钱的人获胜。
请问员工们能拿到奖金吗?
输入描述
第一行为一个整数 T,表示测试数据数量。
每个测试用例包含俩行。第一行为一个整数 n , 第二行包括 n 个整数 a1,a2...an 表示第 i 堆有 ai 元。
1≤T,n≤10^5,1≤ai≤10^9 。
保证所有测试用例的 n 的和不超过 2×10^5。
输出描述
如果员工能拿到奖金输出
YES
, 否则输出NO
。输入输出样例
示例 1
输入
3 2 1 1 1 1 3 2 2 1
输出
YES NO NO
定理:
- 若 a1⊕a2⊕⋯⊕an!=0,先手必胜,记此时的状态为N-position
- 若 a1⊕a2⊕⋯⊕an=0,先手必败,记此时的状态为P-position
(⊕ 表示异或运算)
T = int(input())
while T > 0:n = int(input())ans = 0a = list(map(int, input().split()))for i in range(n):ans ^= a[i]if ans!=0:print('NO')else:print('Yes')print()T-=1
2.小明的游戏5( 威佐夫游戏)
题目描述
蓝桥公司给他们的员工准备了丰厚的奖金,公司主管小明并不希望发太多的奖金,他想把奖金留给智慧的人,于是他决定跟每一个员工玩一个游戏,规则如下:
桌面上一共俩堆钱分别为 a 元和 b 元。
双方轮流行动,由小明先行动,每次行动可以从任意一堆拿任意元,或者从俩堆拿相同的任意元。取走最后一元钱的人获胜。
请问员工们能拿到奖金吗?
输入描述
第一行为一个整数 T,表示测试数据数量。 (1≤T≤105)
每个测试用例包含一行。每行为俩个整数 a 和 b 。(1≤a,b≤10^18)分析两堆石子的数量(a,b),使先手必输的局势有:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9, 15)等等,称这些局势为“奇异局势”。通过观察不难发现,奇异局势有两个特征:
- 差值是递增的,分别是 0, 1, 2, 3, 4, ;
- 每个局势的第一个值是未在前面出现过的最小的自然数。
- 推导奇异局势时,用到的黄金分割数需要较高的精度,直接用 1.618 这个估值是不行的。在代码中用公式计算高精度黄金分割数
:
double gold = (1 + sqrt(5))/2;
输出描述
如果员工能拿到奖金输出
YES
, 否则输出NO
。输入输出样例
示例 1
输入
3 2 1 8 4 4 7
输出
YES NO YES
知识点总结
威佐夫博弈是指的这样一个问题:有两堆各若干个物品,两个人轮流从任意一堆中取出至少一个或者同时从两堆中取出同样多的物品,规定每次至少取一个,至多不限,最后取光者胜利。
假设两堆石子为(x,y)(其中x<y)
那么先手必败,当且仅当(y-x)*(1 + sqrt(5))/2=x
t = int(input())
for i in range(1 , t + 1):a,b = map(int,input().split())c = ((5**(0.5)) + 1) / 2if a > b:a,b = b,aif int((b-a)*c) == a:print("YES")else:print("NO")
3.巴什游戏
- 题目描述:有 n 颗石子,甲先取,乙后取,每次可以拿 1∼m 颗石子,轮流拿下去,拿最后一颗的获胜。
- 输入:n和 m,1≤n,m≤1000。
- 输出:如果先拿的甲赢了,输出“first”,否则输出“second”。
- n≤m 时,由于一次最少拿 1 个,最多拿 m 个,甲可以一次拿完,先手赢。
- n = m+1 时,无论甲拿走多少个(1∼m 个),剩下的都多于 1 个、少于等于 m 个,乙都能一次拿走剩余的石子,后手取胜。
- 如果 n % (m+1) = 0,即 n是 m+1 的整数倍,那么不管甲拿多少,例如 k 个,乙都拿 m+1-k 个,使得剩下的永远是 m+1 的整数倍,直到最后的 m+1 个,所以后拿的乙一定赢。
- 如果 n % (m+1) != 0,即 n 不是 m+1 的整数倍,还有余数 r,那么甲拿走 r 个,剩下的是 m+1 的倍数,相当于甲、乙互换,结果是甲赢。
n,m=map(int,input().split())
if n%(m+1)==0:print('second')
else:print('first')
4.石子游戏
题目描述
两人玩游戏,游戏内容为下:
有 n 个石头,两人每次可以从这 n 个石头中取 p^k 个(p 是任意质数,k 是任意自然数,p^k 要求不大于当前剩余石头数),谁能取走最后石头,谁就获胜了。
问先手取石头的人,有没有必胜的策略。如果先手有,则输出
first
,否则输出second
。输入描述
输入第一行包含一个正整数 T,表示测试数量。
接下来后面T 行,每行包含一个正整数 n,表示石头个数。
1≤T≤10^5,1≤n≤10^6。
输出描述
输出共 T 行,每行分别为
first
或second
。样例输入
3 3 6 9
样例输出
first second first
- 如果 n是 6 的倍数,第二人赢。
- 如果 n 不是 6 的倍数,第一人拿走 1∼5 个石头后,使得剩下数量的是 6 的倍数,那么第 1 人就赢了。
T=int(input())
while T>0:n=int(input())if n%6 :print("first")else:print("second")T-=1
5.取球游戏
题目描述
今盒子里有 n 个小球,A、B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。
我们约定:
每个人从盒子中取出的球的数目必须是:1,3,7 或者 8 个。轮到某一方取球时不能弃权!A 先取球,然后双方交替取球,直到取完。被迫拿到最后一个球的一方为负方(输方)
请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A 是否能赢?
输入描述
先是一个整数 n (n<100),表示接下来有 n 个整数。
然后是 n 个整数,每个占一行(整数< 10^4),表示初始球数。
输出描述
程序则输出 n 行,表示 A 的输赢情况(输为 0,赢为 1)。
输入输出样例
示例
输入
4 1 2 10 18
输出
0 1 1 0
dp = [0 for i in range(10001)]
dp[2] = dp[4] = dp[6] = dp[8] = 1
for i in range(9,len(dp)):if dp[i - 1] == 0:dp[i] = 1elif dp [i - 3] == 0:dp[i] = 1elif dp[i-7] == 0:dp[i] = 1elif dp[i-8] == 0:dp[i] = 1
n = int(input())
for i in range(n):print(dp[int(input())])
小明的游戏(博弈论)相关推荐
- bzoj 2464: 中山市选[2009]小明的游戏(BFS)
2464: 中山市选[2009]小明的游戏 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 963 Solved: 394 [Submit][Sta ...
- P4554 小明的游戏(双端bfs)
P4554 小明的游戏https://www.luogu.com.cn/problem/P4554 #pragma warning(disable:4996) #include <iostrea ...
- 小明的游戏1,小明的游戏5(python)
文章目录 小明的游戏1 分析 运行代码 通过截图 小明的游戏5 分析 运行代码 通过截图 小明的游戏1 题目描述 蓝桥公司给他们的员工准备了丰厚的奖金,公司主管小明并不希望发太多的奖金,他想把奖金留给 ...
- 小明打游戏(Java)
小明在玩升级打怪游戏,这个游戏可以让玩家选择从第i关连续打到第j关(i<=j),每打过一关都会奖励金币或扣除金币.已知每一关奖励或扣除的金币数,小明应该选择从第几关连续打到第几关,才能获得最多金 ...
- BZOJ 1022 Luogu P4279 [SHOI2008]小约翰的游戏 (博弈论)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1022 (luogu) https://www.luogu.org/pro ...
- 【BZOJ1022】小约翰的游戏(博弈论)
[BZOJ1022]小约翰的游戏(博弈论) 题面 BZOJ 题解 \(Anti-SG\)游戏的模板题目. #include<iostream> #include<cstdio> ...
- 2021-12-08:扑克牌中的红桃J和梅花Q找不到了,为了利用剩下的牌做游戏,小明设计了新的游戏规则: 1) A,2,3,4....10,J,Q,K分别对应1到13这些数字,大小王对应0; 2) 游
2021-12-08:扑克牌中的红桃J和梅花Q找不到了,为了利用剩下的牌做游戏,小明设计了新的游戏规则: A,2,3,4-10,J,Q,K分别对应1到13这些数字,大小王对应0; 游戏人数为2人,轮流 ...
- 小明特别喜欢打扑克牌,除了喜欢斗地主和德州扑克之外,还喜欢一种叫桥牌的游戏,桥牌的具体规则相当复杂,有叫牌、打牌和计分三个阶段,还有不断变化的局况,局况可能影响叫牌打牌策略。但是小明暂时不关心这一些,
题目描述: 小明特别喜欢打扑克牌,除了喜欢斗地主和德州扑克之外,还喜欢一种叫桥牌的游戏,桥牌的具体规则相当复杂,有叫牌.打牌和计分三个阶段,还有不断变化的局况,局况可能影响叫牌打牌策略.但是小明暂时不 ...
- 绕圆圈:小明报名参加了趣味运动会,运动会游戏规则如下:在一个环形跑道上,等距离放置着 N 个小球,小球按照顺时针方向从起点开始依次编号为 1 到 N ,在最短时间内取走放在跑道上尽可能多小球的选手获胜
题面描述 小明报名参加了趣味运动会,运动会游戏规则如下:在一个环形跑道上,等距离放置着 N 个小球,小球按照顺时针方向从起点开始依次编号为 1 到 N ,在最短时间内取走放在跑道上尽可能多小球的选手获 ...
最新文章
- POJ1486模拟或者匈牙利变种
- Git——跟踪或取消跟踪文件
- [Redis6]常用数据类型_String字符串
- Network UVA - 315(Tarjan+连通性问题:求割点)
- LeetCode 1000. 合并石头的最低成本(区间DP)
- GP学习(六)—Creating geodatabase and connecting geodatabase
- js中自执行函数(function(){})()和(function(){}())区别
- dynamic 找不到编译动态表达式所需的一种或多种类型。是否缺少引用?
- vbreport8.wpf.viewer 个别电脑不显示_手机听歌不过瘾?一招将Win10电脑变成蓝牙音箱...
- 单片机原理及应用 张鑫_单片机原理及应用_课后答案(张鑫)版.doc
- Spring-全面详解(学习总结)
- Minimax 算法中的 Alpha Beta 剪枝
- 一条大蟒蛇和一条小毒蛇
- SpringBoot2学习笔记
- 51 OCP Oracle数据库认证精品辅导班8期
- java 计算包含中文字符串的真实长度
- JS笔记 | JS中的strict model(严格模式)
- 计算机上函数题怎么做,计算机等级考试,Excel操作题除函数公式外还有哪些常见问题?...
- 玩转软路由 篇五:ROS和OpenWRT的软路由方案中IPTV融合教程
- vue+elementUi+dialog封装自定dialog部分属性,并打包成插件、npm install mj-dialog --save、display、justify、between
热门文章
- 多态的摸索之路( 甲 )
- 密码学归约证明——定长对称加密密钥的敌手不可区分性
- 【职业篇】Linux服务器开发架构师, 高屋建瓴谈谈知识体系的建立丨职业方向就业分析解决你的就业疑虑
- 荣耀接盘者传闻多多,但最可能接盘的是神州数码
- Python GUI 快速入门
- 修改Android“长按”的反应时间
- 网易魔兽怀旧服服务器型号,魔兽世界所有怀旧服服务器名称已出,你觉得哪些名称更好听呢?...
- 给20块钱买可乐,每瓶可乐3块钱,喝完之后退瓶子可以换回1块钱,问最多可以喝到多少瓶可乐。
- 【Java并发编程实战】(十七):Future和CompletableFuture的原理及实战——异步编程没有那么难
- 提供4款WEB网页游戏源码下载,亲测绝对可以用