- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到了 this problem来自已完成的 CodeForces 竞赛。这个问题叫做“关于树的简单问题”。
Pieguy and Piegirl are playing a game. They have a rooted binary tree, that has a property that each node is either a leaf or has exactly two children. Each leaf has a number associated with it.
On his/her turn a player can choose any two leafs that share their immediate parent, remove them, and associate either of their values with their parent, that now became a leaf (the player decides which of the two values to associate). The game ends when only one node (the one that was the root of the tree) is left.
Pieguy goes first, and his goal is to maximize the value that will be associated with the root when the game ends. Piegirl wants to minimize that value. Assuming that both players are playing optimally, what number will be associated with the root when the game ends?
树的大小最多为 250 个节点。
比赛中没有人解决了这个问题。
解决这个问题的有效算法是什么?
我对用 C++(可以在 CodeForces 网站上测试)或用 Javascript(允许我在游戏中添加 AI)的答案感兴趣
问题可以通过选择一个阈值级别 T 并回答“piegirl 能保证得到一个小于或等于 T 的值吗?”这个问题来简化。如果我们能解决这个更简单的问题,那么我们就可以使用二分法找到 T 的最小值,这将是原始问题的答案。
简化后的问题相当于一个有 Blob 的游戏:
规则:
我做了这个游戏的演示here尝试了解该策略。
目前感觉是这样的:
我认为一个简单的 minimax 前瞻(例如,使用一个评估函数对大 blob 的得分更高)在实践中可能会很好地工作,但我觉得应该有一个更好的算法来最优地解决这个问题。
有人有任何进一步的想法吗?
我在演示中添加了一个 minimax 求解器(单击 FindBest 让计算机走一步)。这适用于深度达 4,以毫秒解决,但需要很长时间来思考深度 5 及以上。我可以通过保存之前看到的位置的结果来稍微加快这一速度,但即使有了这种改进,它仍然会有一个巨大的状态空间可供探索。
最佳答案
这不是一个完整的答案,但对于评论来说太长了。
让我们称玩家为蓝色和红色。对于给定的树,在最佳游戏下有四种获胜的可能性:总是蓝色(B
),总是红色(R
),总是第一个玩家(1
),总是第二个玩家 (2
)。如果子树的叶子数为奇数(即移动次数为偶数),我们将子树称为 Even,如果叶子数为偶数(即移动次数为奇数),则称为 Odd。
以下是缺少几个案例的案例分析。它仍然可能对优化极小极大搜索有用。
子树的三种定性不同的可能性是 Even--Even、Even--Odd(对称地,Odd--Even)和 Odd--Odd。让我们对称地假设蓝色先出牌。
蓝色最先播放,最后播放。如果有一个 B
或 1
子树,那么 Blue 在其中下棋获胜。 Blue 对子树的后续选择与 Red 的操作相呼应。如果两个子树都是 R
或 2
,则红色通过呼应蓝色的子树选择获胜。
Missing cases: none
蓝色最先播放,最后播放。如果有一个 B
或 2
子树,那么 Blue 通过在另一个子树中下棋并在 Red 下棋时停在那里而获胜。如果两个子树都是 R
,则 Red 通过在两个子树中强制交替来获胜。
Missing cases: R1 (= 1R), 11
蓝色先玩,红色最后玩。如果奇数子树是 R
或 2
,那么只要蓝色停止,红色就会通过在偶数子树中停滞而获胜。如果偶数子树是 B
或 2
,奇数子树是 B
或 1
,则蓝色获胜在奇数子树中播放并响应红色在同一子树中的后续播放。
Missing cases: RB, R1, 1B, 11
有问题的情况似乎是一个玩家强制另一个玩家在子树中连续移动两次。从比赛参数来看,似乎有足够的时间来确定一个任意移动后的输赢,但案例分析变得很长,比我现在耐心等待的时间还要长。
关于javascript - 在锦标赛中获胜的最佳算法(演示 2 人游戏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25503886/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!