前言
前段时间字节面试的时候,被问到的说
想到会问算法
真是万万没想到遇到一个智力题~
问题&分析
64匹马,8个跑道,问最少比赛多少场,可以选出跑得最快的4匹马
前提:每场比赛每个跑道只允许一匹马,且不存在并列情形
前提:不借助其他工具
- 不借助其他工具,也就说不能记录每匹马跑的时间。
- 每场比赛每个跑道只允许一匹马,是为了限定条件
- 不存在并列情形,减少问题分析情况
常规但非最优的解法
首先因为是比赛,很容易联想到一些计时类赛事,例如短跑,短道速滑这类速度性比赛。
他们的共同点,就是分小组赛,1/4决赛,然后半决赛,决赛这种,每次晋级一半的人。
按照这种常规赛制,比出前四名,就是一个等比数列的问题。
64匹马选出最快的4匹马需要4轮。
每个赛道只能跑8匹马,8+4+2+1 = 15场比赛
能有结果,但是不是最佳算法,无法满足最少比赛场次
的条件。
最少比赛次数解法
第一轮:64进32,共1场( 小组赛)
和常规组一样,每轮8个,进4个。
第二轮:32进10,共1场( 头名排序赛)
这一轮是精妙之处。
仅需一轮比赛,其他的都是推断会淘汰掉的。
仅有的一轮比赛:上一轮8组,每组的第一名进行比赛
排序后可以推断
- 头名排序赛后四名的小组,第一名都在确认不在前四名之中,所以全组淘汰。(入围0匹)
- 头名排序第4的小组,也之后头名有机会入围了,其他淘汰。(入围1匹)
- 头名排序第3的小组,头名+第二名入围,其他淘汰。(入围2匹)
- 头名排序第2的小组,头名+第二名+第三名入围,其他淘汰。(入围3匹)
- 头名排序第1的小组,全组入围。(入围4匹)
截止到现在,目前入围 10 匹马。
但是排序赛可以确认的是,排序第一的小组头名,必定是闪电中的闪电,马中的冠军。所以接下来不用比了。
所以,冠军锁定后,还剩余 9 匹马。
第三轮:9进3,1场或者2场( 决赛 )
这一轮的目的:决定前三名。
但是还剩9匹马,只能先把其中一匹马放下,然后再进行比赛。这里关键是:应该选择哪匹马留下。
目前最危险的排名是排序第4的小组头名
(简称四马),因为它的名次上次比赛最靠后,已经知道有两匹马比它快。现在只要有一匹未出现在头名排赛中的马(简称黑马)比他快,他就会失败。
所以就可以先把他留下,让其他的先比,看下把它淘汰的情况会不会出现。
-
淘汰场景
黑马出现在前两名。
说明干掉了比四马快的三马,三马不知道是否被淘汰,但是四马肯定没戏了,此时取前三名就可
-
加赛场景
黑马出现在第三名
此时无法判断黑马和四马哪个最快,还需要再赛一场 黑马 VS 四马。
综上,这个赛制下,最少比10场,最多比11场,就能选出跑得最快的4匹马~
最后
实际的赛事中,情况更复杂一点,例如短道速滑。
- 预赛
4人一组,每组前两名晋级(标记为Q),时间最快的四名小组第三名选手晋级(标记为q),唯如果有选手因比赛期间遭干扰而被裁判判进下一轮(标记为ADV),分配给时间最快小组第三名选手的晋级名额会相应减少。 - 半准决赛
和预赛规则一致。 - 半决赛
每组前两名及时间最快的小组第三名选手晋级A组决赛(标记为QA),唯如果有选手因比赛期间遭干扰而被裁判判进A组决赛(ADVA),则不会依据总时间分配A组决赛名额。剩馀五位成绩最好的选手晋级B组决赛(QB)。准决赛中犯规的选手无法晋级决赛。 - 决赛:
A组按速度,比出金银铜,B组排出名次。只有A组出现判罚导致奖牌不足时,才会轮到B组。
增加判罚,是因为实际赛制有更多规则,但是有人的地方就有江湖,例如韩国队选手啧啧啧。
增加时间最快的第三名选手,就是说最大概率确保死亡小组场景下公平性。
冬奥会的时候,看比赛倒是没咋注意规则,现在不由感慨数学真的无处不在啊。
另外,我在思考,面试官出这个题是为了考察啥呢?
拓展阅读
双败淘汰赛,瑞士制比赛,三败与多败淘汰赛的设计。