题目:如果要25匹马中选出跑得最快的3匹,每次只有5匹马同时跑,最少要比赛几次,才能确保得出结果?
25匹马看成25个点,每次比赛在参赛的5匹马之间引入4条有向边,1->2->3->4->5,数字表示参赛马的成绩排名。这样最后能形成一个有向无环图, 我们需要得到的是前三名的节点a, b, c, 其中a->b->c, 并且c是剩余节点的祖先。六次比赛(分5组各自比赛,之后后每组的第一名比赛)之后,所有的节点已经连成了一个二叉堆,根节点是第一名。只需要让左右子堆的顶点和它们的子节点一起再比一次,就能决出2,3名。
简单说明7次的最优性,因为每次比赛引入4条有向边,25个顶点要形成树需要24条边,就至少是6次比赛,但6次比赛甚至都不能确定第二名,因为假如根节点只有一个子节点,就说明根节点本身只参加了一组比赛,它的某个子节点参加了至少两组比赛,这时候只要改变这个子节点除了和根节点的比赛外另一场比赛的结果,就能破坏树的结构使之成为polytree,甚至连第一名都没法决定了。
最后,如果要给25匹马全部排名的话,就变成了BIBD(Balanced Incomplete Block Design)问题
题目:一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问最少得比多少场才能知道跑得最快的5匹马?
思路:排除不可能排在前5的马匹
求解过程如下:
(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场。利用画图的方法在每轮比赛后可以直观的删去不需要参与比赛的马,同时选择参与下一轮比赛的马。