小明的游戏1,小明的游戏5(python)

小明的游戏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

通过截图

在这里插入图片描述

如有错误,敬请指正,欢迎交流,谢谢♪(・ω・)ノ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值