目录
一. 拆组逐个比赛法(12次)
二. 循环逐个比赛法(11次)
三. 快速排除比赛法(7次)
一. 拆组逐个比赛法(12次)
这个是比较传统的比较思路,说白了就是直接分组比较,不考虑那么多,也是在本子上简单分组就可以想出来的办法;
第一步: 25人分成A、B、C、D、E 组比赛,因为要选出前三名,所以可以把各组的前三名都筛选出来共15人;
| 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 |
第二步: 然后对15人再次进行分组,分成三组,再比试三轮,然后筛选出来之后,各组的前三名,共9人;
| A1 | B3 | D2 |
| A2 | C1 | D3 |
A3 | C2 | E1 |
| B1 | C3 | E2 |
| B2 | D1 | E3 |
第三步:对9人再分组,分成两组,仍然取前三名,得出6人;
| A1 | C2 |
| A2 | D2 |
| A3 | D3 |
| B3 | E1 |
| C1 |
第四步:6个人分成两组,5人组继续比较,取出前四名,和剩余一人重组队比赛选前三名;
| A1 | E3 |
| A2 | |
| A3 | |
| C2 | |
| D2 |
第五步:最终决赛,选前三名,达到目的;
| A1 |
| A2 |
| A3 |
| C2 |
| E3 |
总结下来,一共比较了 5 + 3 + 2 + 1 + 1 = 12 轮。
二. 循环逐个比赛法(11次)
程序员在遇到这个问题,可能会想到从循环的角度去考虑。
第一步:因为跑道一次只能跑 5 人,而要选出跑得最快的前三名,所以可以先分出来 5 人,比一轮,选出前三位;
| A | (F,G)(H,I) |
| B | (J,K)(L,M) |
| C | (N,O)(P,Q) |
| D | (R,S)(T,U) |
| E | (V,W)(X,Y) |
第二步:选出前三位之后,剩下还有 20 人,分成 2人/组共十组,填补到第一轮已经选出来的前三名当中;
第三步:一直循环,因为有 10 组共需要循环 10 次,加上刚开始的一次,共11次,在最后一轮比较完,记录的前三名就是这 25 人中跑得最快的前三名;
三. 快速排除比赛法(7次)
我们先回看上方的两种办法,其实他们都有一个共同点,就是让一部分选手不停地参与到比赛中去,一直占用跑道位置(在计算机中,可以理解为一部分资源一直参与到循环遍历中去)。
所以会发现,上面的两种做法,比赛的轮次都很多,因此想要降低比赛轮次,首先一点就是要减少晋级选手复跑的次数,可以考虑使用排除法,将一些肯定不能晋级的选手直接排除,不在参与后续的遍历赛跑;
我们仍然分成5组赛跑,得到如下结果,到了这一步,我们首先可以确定各组的前三名,最重要的是知道了各组的第一名。
因此我们接下来最重要的是让这些人员之间产生关联性,并充分利用现有的比赛名次使用少的轮次的出更多的信息。
| 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(第二轮第一名) | B1(第二轮第二名) | C1(第二轮第三名) | D1(pass) | E1(pass) |
| A2 | B2 | C2(pass) | D2(pass) | E2(pass) |
| A3 | B3(pass) | C3(pass) | D3(pass) | E3(pass) |
| A4(pass) | B4(pass) | C4(pass) | D4(pass) | E4(pass) |
| A5(pass) | B5(pass) | C5(pass) | D5(pass) | E5(pass) |
可以得出以下结论:
结论一:D,E两个组的所有人员都跑的慢,直接pass;
结论二:C组除了C1,其余人员也都被淘汰,因为C1前面还有A1,B1;
结论三:B组除了B1,B2,其余人员也都被淘汰,因为B1前面还有A1,只能再往下数一人;
结论四:A组A4,A5淘汰,因为前面还有A1,A2,A3;
综合以上结论之后,再来看表格,会发现经过一轮比赛后,只剩下 A1、A2、A3、B1、B2、C1 六名选手;
而且又因为A1既是A组的第一名,又是所有组第一名比赛的第一名,所以他一定是最快的,就不再需要参赛了,只需要在剩下的5名选手中选出最快的两名,而此时除去A1,正好剩余5人,直接再比最后一轮,从五人中选出前两名,所以最终结果就是 A1 + (A2,A3,B1,B2,C1)中的前两名,就可以知道最快的前三个人!