25匹马,5条赛道,找出最快的5匹马

前段时间面试的时候来了两道逻辑题,一道粗细不均匀的绳子烧出15分钟,比较简单,思考了下就过了。但是这道关于马的,想了很久感觉都没有一个好的解法。

回来之后看了下,这道题据说是google的题,原题是选出最快的三匹马。看了一下,大受启发。三匹马需要七次。我先贴一下我的结论,我这边算出来的结果五匹马应该是9次。

先说下步骤,这道题的算法我还没归纳出来,但是解法颇有些头脑风暴的感觉。首先先选出第一名,然后在第一名附近找出符合的第二三名,选出来之后再在后面选。颇有点动态规划的感觉,可惜我不会动态规划qaq,实在太笨了。

25匹马,分成5组比拼,取每组第一名出来再跑一局。这样选出来的第一名是不是妥妥的第一名。先把马编号,分成abcde五个组,后面跟一个数字表示每一组的马的排名。比如a1就是a组第一名,应该比较好理解。如下图,

a1    b1    c1   d1    e1

a2   b2   c2   d2   e2

a3   b3   c3   d3   e3

a4   b4   c4   d4   e4

a5   b5   c5   d5   e5

上图是角逐五次之后的编号,然后每组第一名们再进行一场比赛,排名就暂定为a1>b1>c1>d1>e1。这是个必然情况嘛,所以a1当之无愧的是第一名。

也就是六次比赛后选出了第一名,接下来那我们选二三名,找到所有距离a1距离为两格的点,分别是a2,a3,b1,b2,c1。很凑巧,刚好只有五匹马,再跑一次,取出前两名。那就是最快的三匹马了。这个时候进行了七次比赛。

这个时候,就需要头脑风暴一下了,a2>a3,b1>b2&&b1>c1,也就是说a1,b1至少有一个是前三。那么两两分组,三四名可能是a2,a3和a2,b1和b1,b2和b1,c1。当然还要选出这里最后一名的马,因为这是不算第一的五匹马排名,算上第一的话,第五名起码在六名开外了,所有慢于他的马都不用管了,最后一名可能是a3,b2,c1。

然后来分类讨论,一种一种来,首先是a1,a3。

如果他们是二三名,那么剩下的有竞争力的对手就是a4,a5,b1,b2,c1了。刚好五匹马,就不考虑什么淘汰不淘汰了,直接跑选出前两名,前两名就是四五名。这样的话次数只要+1就好了,也就是8次。

然后下一种,a2,b1。这种的话,对手就多了,a3,a4  b2,b3  c1,c2,d1。整整七匹马,然后这个时候就考虑一下刚刚被淘汰的最后一名,分别是a3,b2,c1。好,如果是a3,那么a3,a4直接出局,同理,b2的话,b2,b3出局,c1的话后面一坨都没了,这样剪一下,剩下的马只有4-5匹。所以再跑一次取前二,这种也是8次。

然后我做到这里感觉找到了真谛,直接想当然的以为是8次,殊不知,既然穷举就要穷举到底。

当是b1,b2的情况出现时,参赛选手加到了a2,a3,  b3,b4 ,c1,c2,d1。也还是七个人,如果上一轮垫底是c1,那么只有四马要比,可是,如果是a3,那么还有六匹马,这个时候就需要第二轮了。反正目前没用小聪明发现有什么地方可以省的。那就是要+2了

接下来是b1,c1。参赛选手有a2,a3 b2,b3, c2,c3 d1,d2,e1。这次有九位了。九位数选出前二应该需要三次以上了,不过好在刚刚选了最后一名,a3或b2,起码淘汰掉一匹马。八名选前二就比较简单了,先五匹马比赛,把最菜的三匹换成剩下的三匹,选出前两名。所以也还是要+2.

综上,三匹和五匹之间需要再比两次。选出三匹是7次,那么选出5匹我的答案是9次。

原文地址:https://www.cnblogs.com/afei123/p/14030926.html