通过最多问 8 个问题找到最重的球
Find the heaviest ball by asking at most 8 questions
给定 6 个具有 不同 重量的球。目的是找到这些球中最重的一个。
问题以问答方式进行,即我们必须提出问题,问题 setter 为我们提供了答案。
每个问题包括给出 6 个指标中的 5 个指标。返回的答案是 3rd 最重和 2nd 最重的球(按此顺序)。
我们最多可以问8个这样的问题来找到最重的球。
示例:
假设球的索引是 - 1,2,3,4,5,6
.
Q : 1 2 3 4 5 A : 3 4 (here 3 is the third most and 4 is the second most heaviest of the 5 balls)
Q : 1 2 3 4 6 A : 3 4
Q : 1 2 3 5 6 A : 3 5
Q : 1 2 4 5 6 A : 4 5
Q : 1 3 4 5 6 A : 4 5
Q : 2 3 4 5 6 A : 4 5
这 6 个问题足以确定指数为 6 的球是最重的。 (仍然可以再问 2 个问题 - 我们不需要尽量减少问题的数量。此外,这些查询可能会也可能不会对所有 6 个数字进行排序,我们的目标是只找到最重的)。
我正在寻找解决此问题的通用方法(最好不涉及基于案例的分析)。
这好像不是编程。而且我怀疑你编了这个谜题,因为如果它来自一个谜题网站,他们应该知道它永远不需要超过 5 个问题。
首先,在你的前 3 个问题之后,已知答案是 6。怎么会这样?问题 2 的答案没有改变的事实表明,要么 5 和 6 都 > 4 > 3,要么都 < 3 < 4。在问题 3 中,显示 5 > 3 因此 6 > 3。事实5 出现在 #2 表示某物 > 5,唯一可能的答案是 6。所以我们完成了!
你只需要知道你在收集什么信息并充分应用它。
现在让我们以更一般的方式解决问题,这样我们可以更快地解决问题。
第一轮我们什么都不知道,所以我们给权重 1 2 3 4 5
。这将产生一个答案 x y
。将 x
与 6
交换,然后重试。以下是可能性:
- 如果我们得到
y z
而 z
而不是 6
,那么我们的答案是 6
在 2 个问题中,原因与之前找到答案的推理相同。
- 如果我们得到
y 6
或 6 y
,则它不是 x
、y
或 6
。我们将 x
换成其他三个,直到第二名的答案发生变化。发生这种情况的是最重的,最多 5 个问题。
- 如果我们得到
z y
而 z
而不是 6
那么 6
比 y
轻(否则它会把它压低)。我们现在知道答案不是 x
、y
、z
或 6
。所以我们只需要与其他两个交换 x
依次应用与之前相同的推理来找到最多 4 个问题中最重的
我觉得可以这样解决,举个例子:
输入:24、7、12、1986、6、99
Q1: Give me second and third from set {24,7,12,1986,6}
A1: second 24, third 12
现在从这个答案我们知道 24 和 12 永远不会是最重的。所以我们可以记住 idx 的 {0,2} 不属于我们的答案。
现在让我们添加我们一无所知的 idx 5。
Q2: Give me second and third from set that includes our second from first answer {24,7,1986,6,99}
A2: second 99 third 24
现在我们得到第二个,这是我们的新值,所以 idx 值 99 不能是最重的。如果答案 1 中的第二个保持不变,则会发生相同的情况。
另一方面,如果第二个变成第三个,我们已经知道更重的东西在 idx 5 处比之前的所有东西都要重,这就是那个。
在当前状态下,我们有 3 个肯定不是最重的索引:(idx 0)24 (idx 2)12 和 (idx 5)99。
现在让我们请求一些带有 idx 的集合,我们没有任何信息,比如 idx 1。
Q3: Give me second and third from set {24,12,1986,6,99}
A3: second 99, third 24
这个答案与我们从答案 2 中得到的答案没有变化,所以我们知道它不在索引 1 下。算法的其余部分是相同的推导步骤。
即:
我们对 idx 3 一无所知。
Q4: Give me second and third from set {24,7,12,6,99}
A4: second 24 and third 12
这里的 Second 已经改变,因为它之前是 99,这意味着索引 3 有所不同,它就是那个。
给定 6 个具有 不同 重量的球。目的是找到这些球中最重的一个。
问题以问答方式进行,即我们必须提出问题,问题 setter 为我们提供了答案。 每个问题包括给出 6 个指标中的 5 个指标。返回的答案是 3rd 最重和 2nd 最重的球(按此顺序)。 我们最多可以问8个这样的问题来找到最重的球。
示例:
假设球的索引是 - 1,2,3,4,5,6
.
Q : 1 2 3 4 5 A : 3 4 (here 3 is the third most and 4 is the second most heaviest of the 5 balls)
Q : 1 2 3 4 6 A : 3 4
Q : 1 2 3 5 6 A : 3 5
Q : 1 2 4 5 6 A : 4 5
Q : 1 3 4 5 6 A : 4 5
Q : 2 3 4 5 6 A : 4 5
这 6 个问题足以确定指数为 6 的球是最重的。 (仍然可以再问 2 个问题 - 我们不需要尽量减少问题的数量。此外,这些查询可能会也可能不会对所有 6 个数字进行排序,我们的目标是只找到最重的)。
我正在寻找解决此问题的通用方法(最好不涉及基于案例的分析)。
这好像不是编程。而且我怀疑你编了这个谜题,因为如果它来自一个谜题网站,他们应该知道它永远不需要超过 5 个问题。
首先,在你的前 3 个问题之后,已知答案是 6。怎么会这样?问题 2 的答案没有改变的事实表明,要么 5 和 6 都 > 4 > 3,要么都 < 3 < 4。在问题 3 中,显示 5 > 3 因此 6 > 3。事实5 出现在 #2 表示某物 > 5,唯一可能的答案是 6。所以我们完成了!
你只需要知道你在收集什么信息并充分应用它。
现在让我们以更一般的方式解决问题,这样我们可以更快地解决问题。
第一轮我们什么都不知道,所以我们给权重 1 2 3 4 5
。这将产生一个答案 x y
。将 x
与 6
交换,然后重试。以下是可能性:
- 如果我们得到
y z
而z
而不是6
,那么我们的答案是6
在 2 个问题中,原因与之前找到答案的推理相同。 - 如果我们得到
y 6
或6 y
,则它不是x
、y
或6
。我们将x
换成其他三个,直到第二名的答案发生变化。发生这种情况的是最重的,最多 5 个问题。 - 如果我们得到
z y
而z
而不是6
那么6
比y
轻(否则它会把它压低)。我们现在知道答案不是x
、y
、z
或6
。所以我们只需要与其他两个交换x
依次应用与之前相同的推理来找到最多 4 个问题中最重的
我觉得可以这样解决,举个例子:
输入:24、7、12、1986、6、99
Q1: Give me second and third from set {24,7,12,1986,6}
A1: second 24, third 12
现在从这个答案我们知道 24 和 12 永远不会是最重的。所以我们可以记住 idx 的 {0,2} 不属于我们的答案。 现在让我们添加我们一无所知的 idx 5。
Q2: Give me second and third from set that includes our second from first answer {24,7,1986,6,99}
A2: second 99 third 24
现在我们得到第二个,这是我们的新值,所以 idx 值 99 不能是最重的。如果答案 1 中的第二个保持不变,则会发生相同的情况。 另一方面,如果第二个变成第三个,我们已经知道更重的东西在 idx 5 处比之前的所有东西都要重,这就是那个。
在当前状态下,我们有 3 个肯定不是最重的索引:(idx 0)24 (idx 2)12 和 (idx 5)99。
现在让我们请求一些带有 idx 的集合,我们没有任何信息,比如 idx 1。
Q3: Give me second and third from set {24,12,1986,6,99}
A3: second 99, third 24
这个答案与我们从答案 2 中得到的答案没有变化,所以我们知道它不在索引 1 下。算法的其余部分是相同的推导步骤。
即:
我们对 idx 3 一无所知。
Q4: Give me second and third from set {24,7,12,6,99}
A4: second 24 and third 12
这里的 Second 已经改变,因为它之前是 99,这意味着索引 3 有所不同,它就是那个。