题目
算法题: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名以及后面的序列,但是要注意,这五匹马也是有暗藏序列的(看上一步),接下来分析所有可能出现的情况,我们按照在前三和不在前三的纬度,降低复杂度:
- 假设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再赛一次就可以出结果,刚好用完剩下的三个赛道
- 假设a2不在前三,直接淘汰掉a2,a3,a4(过程不细写,思路和上面分析一样):
- b2在前2,取b3和c1赛一场,占用两个赛道
- c1在前2,取b3,c2,d1赛一场,占用3个赛道 这一轮是分两次赛的,但加起来最多占用8个赛道