- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下场景:
我们能否预测谁将获得第一名、第二名和最后一名?构建者是否应该遵循任何算法来首先完成他们的工作?
下面是问题的实际例子:
让我们说:
builder 1 has: b2 b5 b8 b9
builder 2 has: b1 b11
builder 3 has: b3 b4 b6 b7 b10 b12
builder 1和 builder 2必须等待 builder 3放置b4。
builder 3 将放置 b4,并将他的位置归还给 builder 1。
wall: b4
builder 1 将不得不放置 b5,因为他别无选择。
wall: b4 b5
builder 2 会跟进,但他不能放置他的积木,他将不得不等待 b2 或 b10。
Builder 3 现在有两个选项:b3 或 b6,他必须选择帮助他先完成的那个。
wall: b4 b5 b6
builder 1 无事可做,他将轮到 builder 2。
builder 2还在等待b2或b10的安装。
builder 3 必须放置 b7。
wall: b4 b5 b6 b7
builder 1 现在将放置 b8。
wall: b4 b5 b6 b7 b8
builder 2还在耐心等待中……
builder 3 被迫放下 b3,因为没有其他选择,他希望 builder 2 可以放置 b9... 但他的希望破灭了!
wall: b3 b4 b5 b6 b7 b8
builder 1 现在完全负责了,感觉很开心!但他很困惑!在思考之后,他决定 b2 可能允许他继续阻止更多的 block ,这反过来又增加了他的机会。
wall: b2 b3 b4 b5 b6 b7 b8
builder 2 说:终于!一些行动!并放置 b1。
wall: b1 b2 b3 b4 b5 b6 b7 b8
builder 3 失去了成为第一的希望!
builder 1 现在将安装他的最后一个区 block 并带着最大的奖励回家!
wall: b1 b2 b3 b4 b5 b6 b7 b8 b9
builder 2 将等待...
Builder 3 遗憾地放置了 b10
builder 2 放置 b11 并带着第二个奖励回家......
有解决此类问题的已知算法吗?
最佳答案
乍一看,球员的力量是他最高和最低盖帽所跨越的范围的函数。在您的示例游戏中,我们可以看到 Builder 1 完全支配 Builder 2。
Builder 1: 2 ----------- 9
Builder 2: 1 ----------------- 11
Builder 3: 3 --------------- 12
Start position: ^^
由于游戏从 b4 开始,所以最重要的棋子都在高端。例如,Builder 3 有 b3,它阻止了其他 2 个移动(b2 和 b1);但是,这不是很决定性的。阻止 b2 和 b1 的 block b3 仅与阻止 b6 和 b7 的 b5 一样强大。
真正的力量在上图的右侧。这意味着具有上述初始起始范围的游戏通常会这样结束:Builder 1、Builder 2,然后是 Builder 3。
至于玩家策略,这里有一个公认的推测性指南:捕获你最强大的棋子,也就是那些能阻止其他玩家移动最多的棋子。在此策略中,您持有的每一 block 棋子都可以根据它阻止的其他移动次数分配一个分数。
例如,假设墙位于 b3-b4-b5,而您持有 b2、b6 和 b9。您可以玩 b2 或 b6。你如何评价你的作品?
b2 score = 1 (prevents b1)
b9 score = 3 (prevents b10, b11, b12)
b6 score = 2 (prevents b7, b8)
请注意,b6 不会因为阻止 b10 和更高版本而获得荣誉,因为 b9 正在做这项工作(Matthieu M. 也指出了这一点)。在这种情况下,您应该更愿意先玩 b2,因为它使您面临其他玩家完成游戏的风险最小。
其他答案提出了不想阻碍自己进步的有趣想法,建议先打b6。但我认为加速向 b9 的移动不会有任何好处。你想尽可能地延迟 b9,因为它是最能保证(从概率的角度)防止其他玩家完成的棋子。
更新:
我编写了一个 Perl 模拟来测试一些简单的玩家策略。我开始怀疑玩家策略是否无关紧要。我尝试了以下方法:(a)选择最高的方 block ; (b) 选择最低的方 block ; (c) 我推荐的策略是选择最安全的区 block (防止其他人移动最多的区 block )。我通过授予第一名 3 分、第二名 2 分和第三名 1 分来评估这些策略。这些策略中没有一个始终比随机选择表现更好(或更差)。
当然,可以设想玩家的选择会影响结果的场景。例如,如果 block 是这样分布的,玩家 3 将获得第一名或第二名。
b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12
2 1 3 1 3 2 2 2 2 2 2 2
然而,从概率的角度来看,这种结果变化可以简化为:玩家 3 将获胜,除非他选择了与仅剩一个方 block 的玩家相邻的方 block 。换句话说,准确的结果是掷硬币。
所以问题来了:谁能提供一个结果既不是命中注定也不是掷硬币的场景?我试了大约 15 分钟,然后就觉得无聊了。
关于解决积木问题所需的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2269815/
滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口
表达式求值:一个只有+,-,*,/的表达式,没有括号 一种神奇的做法:使用数组存储数字和运算符,先把优先级别高的乘法和除法计算出来,再计算加法和减法 int GetVal(string s){
【算法】前缀和 题目 先来看一道题目:(前缀和模板题) 已知一个数组A[],现在想要求出其中一些数字的和。 输入格式: 先是整数N,M,表示一共有N个数字,有M组询问 接下来有N个数,表示A[1]..
1.前序遍历 根-左-右的顺序遍历,可以使用递归 void preOrder(Node *u){ if(u==NULL)return; printf("%d ",u->val);
先看题目 物品不能分隔,必须全部取走或者留下,因此称为01背包 (只有不取和取两种状态) 看第一个样例 我们需要把4个物品装入一个容量为10的背包 我们可以简化问题,从小到大入手分析 weightva
我最近在一次采访中遇到了这个问题: 给出以下矩阵: [[ R R R R R R], [ R B B B R R], [ B R R R B B], [ R B R R R R]] 找出是否有任
我正在尝试通过 C++ 算法从我的 outlook 帐户发送一封电子邮件,该帐户已经打开并记录,但真的不知道从哪里开始(对于 outlook-c++ 集成),谷歌也没有帮我这么多。任何提示将不胜感激。
我发现自己像这样编写了一个手工制作的 while 循环: std::list foo; // In my case, map, but list is simpler auto currentPoin
我有用于检测正方形的 opencv 代码。现在我想在检测正方形后,代码运行另一个命令。 代码如下: #include "cv.h" #include "cxcore.h" #include "high
我正在尝试模拟一个 matlab 函数“imfill”来填充二进制图像(1 和 0 的二维矩阵)。 我想在矩阵中指定一个起点,并像 imfill 的 4 连接版本那样进行洪水填充。 这是否已经存在于
我正在阅读 Robert Sedgewick 的《C++ 算法》。 Basic recurrences section it was mentioned as 这种循环出现在循环输入以消除一个项目的递
我正在思考如何在我的日历中生成代表任务的数据结构(仅供我个人使用)。我有来自 DBMS 的按日期排序的任务记录,如下所示: 买牛奶(18.1.2013) 任务日期 (2013-01-15) 任务标签(
输入一个未排序的整数数组A[1..n]只有 O(d) :(d int) 计算每个元素在单次迭代中出现在列表中的次数。 map 是balanced Binary Search Tree基于确保 O(nl
我遇到了一个问题,但我仍然不知道如何解决。我想出了如何用蛮力的方式来做到这一点,但是当有成千上万的元素时它就不起作用了。 Problem: Say you are given the followin
我有一个列表列表。 L1= [[...][...][.......].......]如果我在展平列表后获取所有元素并从中提取唯一值,那么我会得到一个列表 L2。我有另一个列表 L3,它是 L2 的某个
我们得到二维矩阵数组(假设长度为 i 和宽度为 j)和整数 k我们必须找到包含这个或更大总和的最小矩形的大小F.e k=7 4 1 1 1 1 1 4 4 Anwser是2,因为4+4=8 >= 7,
我实行 3 类倒制,每周换类。顺序为早类 (m)、晚类 (n) 和下午类 (a)。我固定的订单,即它永远不会改变,即使那个星期不工作也是如此。 我创建了一个函数来获取 ISO 周数。当我给它一个日期时
假设我们有一个输入,它是一个元素列表: {a, b, c, d, e, f} 还有不同的集合,可能包含这些元素的任意组合,也可能包含不在输入列表中的其他元素: A:{e,f} B:{d,f,a} C:
我有一个子集算法,可以找到给定集合的所有子集。原始集合的问题在于它是一个不断增长的集合,如果向其中添加元素,我需要再次重新计算它的子集。 有没有一种方法可以优化子集算法,该算法可以从最后一个计算点重新
我有一个包含 100 万个符号及其预期频率的表格。 我想通过为每个符号分配一个唯一(且前缀唯一)的可变长度位串来压缩这些符号的序列,然后将它们连接在一起以表示序列。 我想分配这些位串,以使编码序列的预
我是一名优秀的程序员,十分优秀!