一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问最少得比多少场才能知道跑得最快的5匹马?
这是一道比较常见的算法题,网上也有比较详细的解法(见http://hxraid.javaeye.com/blog/662643)。今天刚好有人拿来讨论,所以自己也想了下,用一种画图的方式来得到了答案。
求解过程如下:
(1)25匹马分五组跑5场得到每组的排序。
(2)第6场:用每组的第一名来跑。得到这五组中第一名之间的排序。如图1所示
图1 第6场结果
如图1所示,图中红色圈表示可以不需要比较的马
(3)第7场:从6-1所在组选出排名2、3的马,从6-2所在组选出排名第2的马,加上6-2和6-3跑进行比赛。
a. 假设比赛结果如图2a所示。
如图2a所示,实际上在第6场之后已经得到了所有马中的第1名(图中绿色点)。同时根据第7轮的比赛结果,又得到了一些
不需要比较的马(图中新增的红色点),而且可以确定所有马中的第2和3第名分别为7-1和7-2。再用剩下没有确定的4匹马
比赛一场即可以得到所有马中的第4和第5名。这种情况下,最多需要比赛8场。
b. 假设结果如图2b所示
确定所有马中的第2和3第名分别为7-1和7-2后,还剩下8匹不确定的马。先任意取出5匹来比,得到前两名,再用他们和剩下
的三匹比一场,可以得到所有马的第4和第5名。因此,最多还需要比2场。
综上所述,最坏情况下需要9场比赛才能达到目标。最坏情况出现在6-2和6-3变为7-1和7-2时,这种情况下需要9场,其他
情况都只需要8场。利用画图的方法在每轮比赛后可以直观的删去不需要参与比赛的马,同时选择参与下一轮比赛的马。