【算法】经典博弈论问题——威佐夫博弈 python

news/2025/1/31 11:46:02 标签: 算法, python, 开发语言

目录

  • 威佐夫博弈(Wythoff Game)
  • 【模板】


威佐夫博弈(Wythoff Game)


有两堆石子,数量任意,可以不同,游戏开始由两个人轮流取石子
游戏规定,每次有两种不同的取法
1)在任意的一堆中取走任意多的石子
2)可以在两堆中同时取走相同数量的石子
最后把石子全部取完者为胜者
现在给出初始的两堆石子的数目,返回先手能不能获胜

结论:

小!=(大-小)* 黄金分割比例,先手赢
小=(大-小)* 黄金分割比例,后手赢

证明较复杂,此处略


【模板】


[SHOI2002] 取石子游戏


题目描述

有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法:一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

输入格式

输入共一行。

第一行共两个数 a , b a, b a,b,表示石子的初始情况。

输出格式

输出共一行。

第一行为一个数字 1 , 0 1,0 1,0 − 1 -1 1,如果最后你是胜利者则为 1 1 1;若失败则为 0 0 0;若结果无法确定则为 − 1 -1 1

样例输入

8 4

样例输出

1

数据范围

50 % 50\% 50% 的数据满足 a , b ≤ 1000 a, b \le 1000 a,b1000

100 % 100\% 100% 的数据满足 a , b ≤ 1 0 9 a, b \le 10^9 a,b109


code:

python">import math

# 黄金分割率
phi = (1 + math.sqrt(5)) / 2

a,b=map(int,input().split())
if a > b:
    a, b = b, a  # 确保a <= b
k = (b - a) * phi

# 检查是否为奇异局势
if math.floor(phi * k) == a :
    print(0)
else:
    print(1)

会被卡一个测试点

在这里插入图片描述

需要高精度(C++需要long double)

题解:

python">import math
from decimal import Decimal, getcontext

# 设置高精度
getcontext().prec = 50  # 设置精度为50位小数

# 黄金分割率
phi = (Decimal(1) + Decimal(5).sqrt()) / Decimal(2)

a, b = map(int, input().split())
if a > b:
    a, b = b, a  # 确保a <= b
k = math.floor((b - a) * phi)

# 检查是否为奇异局势
if k == a:
    print(0)
else:
    print(1)

END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢


http://www.niftyadmin.cn/n/5838626.html

相关文章

【redis进阶】分布式锁

目录 一、什么是分布式锁 二、分布式锁的基础实现 三、引入过期时间 四、引入校验 id 五、引入lua 六、引入 watch dog (看门狗) 七、引入 Redlock 算法 八、其他功能 redis学习&#x1f973; 一、什么是分布式锁 在一个分布式的系统中&#xff0c;也会涉及到多个节点访问同一…

Java面试题2025-并发编程基础(多线程、锁、阻塞队列)

并发编程 一、线程的基础概念 一、基础概念 1.1 进程与线程A 什么是进程&#xff1f; 进程是指运行中的程序。 比如我们使用钉钉&#xff0c;浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 …

7.抽象工厂(Abstract Factory)

抽象工厂与工厂方法极其类似&#xff0c;都是绕开new的&#xff0c;但是有些许不同。 动机 在软件系统中&#xff0c;经常面临着“一系列相互依赖的对象”的创建工作&#xff1b;同时&#xff0c;由于需求的变化&#xff0c;往往存在更多系列对象的创建工作。 假设案例 假设…

车载软件 --- 大一新生入门汽车零部件嵌入式开发

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

Vue.js组件开发-实现全屏背景图片滑动切换特效

使用 Vue 实现全屏背景图片滑动切换特效的详细步骤、代码、注释和使用说明。 步骤 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个新的 Vue 项目。准备图片资源&#xff1a;准备好要用于背景切换的图片&#xff0c;并将它们放在项目的合适目录下。编写 HTML 结构&#xff1…

JAVA 接口、抽象类的关系和用处 详细解析

接口 - Java教程 - 廖雪峰的官方网站 一个 抽象类 如果实现了一个接口&#xff0c;可以只选择实现接口中的 部分方法&#xff08;所有的方法都要有&#xff0c;可以一部分已经写具体&#xff0c;另一部分继续保留抽象&#xff09;&#xff0c;原因在于&#xff1a; 抽象类本身…

Kafka常见问题之 org.apache.kafka.common.errors.RecordTooLargeException

文章目录 Kafka常见问题之 org.apache.kafka.common.errors.RecordTooLargeException: The message is 1,048,576 bytes when serialized which is larger than the maximum request size.1. 错误解析2. 错误原因3. 错误复现案例3.1 生产者发送超大消息 4. 解决方案4.1 方法 1&…

Linux 常用命令——系统设置篇(保姆级说明)

系统设置类 显示当前运行的进程&#xff08;ps&#xff09; ps [options] [--help]# 查找指定进程格式&#xff1a; ps -ef | grep 进程关键字# 显示进程信息 ps -A 参数&#xff1a; -A 列出所有的进程 -w 显示加宽可以显示较多的资讯 -au 显示较详细的资讯 -aux 显示所有包…