题目描述
64匹马,8个跑道,需要赛多少场,选出最快的四匹马?
题目分析
题目本身是含义不清楚的,但是既然是程序员面试题,隐含条件是:
1、不能计时;
2、在最坏的情况下,至少多少轮比赛,必然能选择出最快的4批马?
求解过程
第一步(前8场),64匹马分成 8组,每组8匹,淘汰每组的后四名(8场)
如下图:
结果:
第二步(第9场),取每组第一名进行一次比赛,然后淘汰最后四名所在组的所有马、第四名所在组后三匹、第三名所在组的后两匹以及第二名所在组的最后一匹(1场),最终剩余下图中的蓝色A1(总冠军)以及深黄色区域(9匹)角逐总亚军,总季军,总第四名,如下图:
第三步(第10场),只要从上面的9匹马中找出跑得最快的三匹马就可以了,选择第二步中前三名所在的剩余马 8 匹(下图中红色框框)进行比赛(1场),可能出现两种情况:
- 若B1的名次为 3 或者 4,那么本次比赛的前三名就是总亚军,总季军,总第四名(最好10场选出最终结果)
- 若B1的名次为 1或者 2,那么还需要进行一场比赛
第四步(第11场),两种情况
- 若第10场B1的名次为 1(可以排除第一组的第四名A4),那么就让下图一红框中的7匹马角逐:
本场比赛前2名就是总季军,总第四名
- 若第10场B1的名次为 2,说明第10场的第一名师总亚军(可能是A2,A3,A4),那么说明A2是第二名,而A4,B3,C2,D1都不可能是前4名(淘汰掉),只需要剩下C1,B2,A3这3匹马角逐总第四名就可以了
最好情况10场 ,最坏11场角逐总前4名。