25人赛跑,跑道每次最多5人,没有计时器,但可以记顺序,怎样用最少的比赛次数选出最快的3个人?
2026/8/20 15:22:59 网站建设 项目流程

目录

一. 拆组逐个比赛法(12次)

二. 循环逐个比赛法(11次)

三. 快速排除比赛法(7次)


一. 拆组逐个比赛法(12次)

这个是比较传统的比较思路,说白了就是直接分组比较,不考虑那么多,也是在本子上简单分组就可以想出来的办法;

第一步: 25人分成A、B、C、D、E 组比赛,因为要选出前三名,所以可以把各组的前三名都筛选出来共15人;

A1B1C1D1E1
A2B2C2D2E2
A3B3C3D3E3
A4B4C4D4E4
A5B5C5D5E5

第二步: 然后对15人再次进行分组,分成三组,再比试三轮,然后筛选出来之后,各组的前三名,共9人;

A1B3D2
A2C1D3

A3

C2E1
B1C3E2
B2D1E3

第三步:对9人再分组,分成两组,仍然取前三名,得出6人;

A1C2
A2D2
A3D3
B3E1
C1

第四步:6个人分成两组,5人组继续比较,取出前四名,和剩余一人重组队比赛选前三名;

A1E3
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(第一名)
A2B2C2D2E2
A3B3C3D3E3
A4B4C4D4E4
A5B5C5D5E5

所以我们可以将各组的第一名重新组队,在比赛第二轮,假设A1,B1,C1胜出,D1,E1则垫底淘汰。

A1(第二轮第一名)B1(第二轮第二名)C1(第二轮第三名)D1(pass)E1(pass)
A2B2C2(pass)D2(pass)E2(pass)
A3B3(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)中的前两名,就可以知道最快的前三个人!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询