给出6个重量不同的球。目的是找到这些球中最重的球。
问题以回答问题的方式进行,即我们必须提出问题,问题解决者才能为我们提供答案。 每个问题包括六个中的五个索引。返回的答案是最重3 rd 和最重2 nd 球的索引(按此顺序)。 我们最多可以问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个数字进行排序,我们的目标是仅查找最重的数字。)
我正在寻找一种解决此问题的通用方法(最好不涉及基于案例的分析)。
答案 0 :(得分:1)
这似乎不是编程。而且我怀疑您组成了这个难题,因为如果它不在一个难题网站上,他们应该已经知道它永远不需要超过5个问题。
首先,在回答了您的第三个问题后,已知答案是6。怎么办?问题2答案没有改变的事实表明5和6都是> 4> 3,或者都是<3 <4。在问题3上,发现5> 3因此是6> 3。 #2中出现5表示某事物> 5,唯一可能的答案是6。所以我们完成了!
您只需要知道要收集什么信息并充分应用它即可。
现在让我们以更一般的方式解决问题,以便更快地解决问题。
第一轮我们一无所知,因此我们权衡1 2 3 4 5
。这将产生一个答案x y
。将x
与6
交换,然后重试。这是可能性:
y z
而不是z
的{{1}},那么我们的答案是2个问题中的6
,原因与之前找到答案的原因相同。6
或y 6
,则不是6 y
,x
或y
。我们将6
交换为其他三个x
,直到第二位答案改变为止。发生的问题最重,最多5个问题。z y
而不是z
的{{1}},则6
比6
轻(否则它会被压低)。现在我们知道答案不是y
,x
,y
或z
。因此,我们只需要与其他两个人依次交换6
即可,使用与以前相同的推理,以在最多4个问题中找到最重的问题。答案 1 :(得分:0)
我认为可以这样解决,例如:
输入: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之下。算法的其余部分是相同的推导步骤。
IE:
我们对idx 3一无所知。
Q4: Give me second and third from set {24,7,12,6,99}
A4: second 24 and third 12
此处Second已更改,因为以前是99,这意味着索引3有所不同,而它就是那个。