小明的游戏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
运行限制
最大运行时间:1s
最大运行内存: 128M
分析
- 尼姆博奕(二进制异或)
- 异或结果为1:先手赢
- 异或结果为0:后手赢
- 具体原理以后再讲
运行代码
t = int(input())
while t>0:
n = int(input())
nums = list(map(int,input().split()))
res = 0
for i in range(n):
res ^= nums[i]
if res: # 先手赢
print("NO")
else:
print("YES")
t-=1
通过截图
小明的游戏5
题目描述
蓝桥公司给他们的员工准备了丰厚的奖金,公司主管小明并不希望发太多的奖金,他想把奖金留给智慧的人,于是他决定跟每一个员工玩一个游戏,规则如下:
桌面上一共俩堆钱分别为 a 元和 b 元。
双方轮流行动,由小明先行动,每次行动可以从任意一堆拿任意元,或者从俩堆拿相同的任意元。取走最后一元钱的人获胜。
请问员工们能拿到奖金吗?
输入描述
第一行为一个整数 T,表示测试数据数量。 (1≤T≤10^5)
每个测试用例包含一行。每行为俩个整数 a 和 b 。(1≤a,b≤10^18)
输出描述
如果员工能拿到奖金输出 YES ,否则输出 NO。
输入输出样例
示例 1
输入
3
2 1
8 4
4 7
输出
YES
NO
YES
运行限制
最大运行时间:2s
最大运行内存: 128M
分析
- 威佐夫博弈
- 黄金分割率(
(根号5+1)/2
)乘以差值取整 == 较小的数,先手必败 - 具体原理以后再说
运行代码
import math
n = int(input())
gold = (math.sqrt(5)+1)/2
while n>0:
a,b = map(int,input().split())
if a > b:
a,b = b,a
if int(gold * (b-a)) == a:# 黄金比例一出,先手必输
print("YES")
else:
print("NO")
n-=1
通过截图
如有错误,敬请指正,欢迎交流,谢谢♪(・ω・)ノ