用二叉树求解关于25匹马,五个赛道。取前三名,和取前五名最少次数是多少。

关于问题有25匹马,速度都不同,但每匹马的速度都是定值。现在只有5条赛道,无法计时,即每赛一场最多只能知道5匹马的相对快慢。问最少赛几场可以找出25匹马中速度最快的前3名?找出前五名呢?

  • 面试中遇到的问题,以前听过但是没有看题,也没有思考过。面试结束认真思考了一下
  • 这个问题引入二叉树的话会更好理解和解决

首先讲如何取得前三名

  • 首先不论怎么操作,六次保底是跑不掉的。不管是取前三名还是前五名。
  • 我们分别跑了六次,得到了
    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
  • 接着我们用二叉树表示 就能得到下图
    用二叉树求解关于25匹马,五个赛道。取前三名,和取前五名最少次数是多少。
  • 那么我们首先找前三名,在A1为最大的已知情况下。我们以A为起点画取可行的三点路线。这样的路线只需要满足路线上的点是链接在一起的就可以得到所有前三名的可能性路线(这是重点圈起来)。有以下几种路线:
    用二叉树求解关于25匹马,五个赛道。取前三名,和取前五名最少次数是多少。
    A1 A2 A3
    A1 A2 B2
    A1 B1 A2
    A1 A2 B1
    A1 B1 C1
    • 这样我们就能得到全部前三名的可能。那么只需要将不确定的几项进行比赛,就可以得到二三名的编号。从而得到前三名。那么我们进行比赛的编号就是
      A2 A3 B1 B2 C1
      决出二三名。
      也就是说这只需要6+1次(即七次)即可得到前三名。

然后我们来看如何得到前五名

我们已经直接可以列举出前三名的几种可能。
A1 A2 A3
A1 A2 B2
A1 B1 A2
A1 A2 B1
A1 B1 C1
那么接下来我们需要确定的就是剩下的四五名。
以第四种可能为例,我们可以将前三名的路线圈起来当成一个节点,这样就可以继续使用开头的方法来确定四五名的可能路线,如下图。
用二叉树求解关于25匹马,五个赛道。取前三名,和取前五名最少次数是多少。
这样明显比开头复杂了不少,但要注意的是我们还有额外的一个条件和最开始不一样。
这里与开头不同的是,由于我们在取得的二三名时,我们也得到了第七次比赛的最后一名。比如A3是最后一名。因为它所延伸出去的线路上的数都比它小,而A3前面已经确定有五匹比它快的马了。那么我们就可以将A3所在的可能连接线路直接去除。并绘制可能路线如下图。
用二叉树求解关于25匹马,五个赛道。取前三名,和取前五名最少次数是多少。
那就只剩下四种可能性:
一二三 C1 D1
一二三 C1 B2
一二三 B2 C1
一二三 B2 C2
这样我们只需C1 D1 B2 C2四匹马比赛得到一二名即可得到四五名,那就只需7+1次(八次)
而最多的情况则需要继续比较八匹马,在第一种情况A1 A2 A3 时,那么它第七次比赛的第五名只可能是C1或者B2。
若为C1则可能路线图则为:
用二叉树求解关于25匹马,五个赛道。取前三名,和取前五名最少次数是多少。
则需要比较B1 B2 C2 B3 C3 A4 B4 A5八匹马,我们就需要先比较五匹得出前两名和剩下三匹比赛得到前两名即为四五名,需要7+2次(即九次)。
这种情况就与直接比较每组未决出最终名次的最快马直接比赛的方法所需要次数相同了(即在得到前三名后,将除了前三名之外的每组最快的马进行比赛得到第一名,得到总体第四名。然后除了前四名,每组最快的进行比赛,得到总体第五名。该方法也只需要九次)。
若为B2则需比较七匹马也需要九次。
其余可能性也与这两类大致仿佛,故而若论取前三名和前五名,最少次数分别为七次和八次。