算法题:64匹马,8个跑道。一个跑道一次只能上一匹马,最快安排跑几次选出跑得最快的4匹马?不能计时

1,105 阅读3分钟

题目

算法题:64匹马,8个跑道。一个跑道一次只能上一匹马,最快安排跑几次选出跑得最快的4匹马?不能计时

解析

这是一道算法题,看似简单,咋一看,跑15(8+4+2+1)次就能选出来,但是细想还是可以进一步优化的,经过层层优化,最终确定比赛10次就能选出跑得最快的四匹马,接下来分享我的解题思路,注意:不能漏选,不能计时,但是没说必须要同时在赛道上跑,我的解题思路前提是,安排跑一次的概念是8个赛道都跑一次,而不是比一次。

第一步,首先把64匹马分成八组,比赛8次之后按照顺序编号,分别为:

1 2 3 4 5 6 7 8
a1 a2 a3 a4 a5 a6 a7 a8
b1 b2 b3 b4 b5 b6 b7 b8
c1 c2 c3 c4 c5 c6 c7 c8
d1 d2 d3 d4 d5 d6 d7 d8
e1 e2 e3 e4 e5 e6 e7 e8
f1 f2 f3 f4 f5 f6 f7 f8
g1 g2 g3 g4 g5 g6 g7 g8
h1 h2 h3 h4 h5 h6 h7 h8

比赛完之后,取每组前四名,后四名淘汰掉,所以结果还是8组,每组四匹马,如下(此时每组的前后顺序是确定的,a1>a2>a3>a4):

1 2 3 4
a1 a2 a3 a4
b1 b2 b3 b4
c1 c2 c3 c4
d1 d2 d3 d4
e1 e2 e3 e4
f1 f2 f3 f4
g1 g2 g3 g4
h1 h2 h3 h4

第二步,取每组第一名比赛一次,结果只保留前四名所在的组,后四名所在的组淘汰掉,所以结果为(取前四组,重新编号,此时各组的前后顺序也是确定的,也就是说,a1>b1>c1>d1):

1 2 3 4
a1 a2 a3 a4
b1 b2 b3 b4
c1 c2 c3 c4
d1 d2 d3 d4

第三步,我们再对数据进行一轮筛选,第一名直接选出来,淘汰掉名次肯定在第四名以后的,结果为:

1 2 3 4
X a2 a3 a4
b1 b2 b3
c1 c2

d1 还剩下9匹马,要选出前三,其中可以确定的顺序为:

a2 > a3 > a4

b1 > b2 > b3

b1 > c1 > c2

b1 > c1 > d1 第二名无法确定,所以还要接着比

第四步,取上一步结果每一个序列的前两名进行比赛,也就是,a2, a3, b1, b2, c1,五匹马,占用五个赛道,还剩下三个赛道,保留前3名以及后面的序列,但是要注意,这五匹马也是有暗藏序列的(看上一步),接下来分析所有可能出现的情况,我们按照在前三和不在前三的纬度,降低复杂度:

  1. 假设a2在前3,a3有两种情况:
    • a3在前三,还剩一个名额,必在b1,a4之间,只需要2个赛道赛一次就出结果
    • a3不在前三,淘汰掉a3和a4,b1必在前3,b2和c1只有一个在前三
      • b2在前3,继续淘汰c1,c2,d1,如果a2在前2,直接出结果;如果a2不在前2名,取b3和a2赛一次就可以出结果,只用剩下的2个赛道
      • c1在前3,继续淘汰b2,b3,如果a2在前2,直接出结果;如果a2不在前2名,取a2,c2,d1再赛一次就可以出结果,刚好用完剩下的三个赛道
  2. 假设a2不在前三,直接淘汰掉a2,a3,a4(过程不细写,思路和上面分析一样):
    • b2在前2,取b3和c1赛一场,占用两个赛道
    • c1在前2,取b3,c2,d1赛一场,占用3个赛道 这一轮是分两次赛的,但加起来最多占用8个赛道

以上是个人的理解,如果有更好思路的,欢迎评论区留言。