面试官:64匹马最少跑几次可以找出前四名?

307 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

前言

前段时间字节面试的时候,被问到的说 想到会问算法 真是万万没想到遇到一个智力题~

问题&分析

64匹马,8个跑道,问最少比赛多少场,可以选出跑得最快的4匹马 前提:每场比赛每个跑道只允许一匹马,且不存在并列情形 前提:不借助其他工具

  • 不借助其他工具,也就说不能记录每匹马跑的时间。
  • 每场比赛每个跑道只允许一匹马,是为了限定条件
  • 不存在并列情形,减少问题分析情况

常规但非最优的解法

首先因为是比赛,很容易联想到一些计时类赛事,例如短跑,短道速滑这类速度性比赛。

他们的共同点,就是分小组赛,1/4决赛,然后半决赛,决赛这种,每次晋级一半的人。 按照这种常规赛制,比出前四名,就是一个等比数列的问题。

64匹马选出最快的4匹马需要4轮。 每个赛道只能跑8匹马,8+4+2+1 = 15场比赛

WX20220808-230654@2x.png

能有结果,但是不是最佳算法,无法满足最少比赛场次的条件。

最少比赛次数解法

第一轮:64进32,共1场( 小组赛) 和常规组一样,每轮8个,进4个。

WX20220808-230630@2x.png

第二轮:32进10,共1场( 头名排序赛) 这一轮是精妙之处。 仅需一轮比赛,其他的都是推断会淘汰掉的。 仅有的一轮比赛:上一轮8组,每组的第一名进行比赛

排序后可以推断

  1. 头名排序赛后四名的小组,第一名都在确认不在前四名之中,所以全组淘汰。(入围0匹)
  2. 头名排序第4的小组,也之后头名有机会入围了,其他淘汰。(入围1匹)
  3. 头名排序第3的小组,头名+第二名入围,其他淘汰。(入围2匹)
  4. 头名排序第2的小组,头名+第二名+第三名入围,其他淘汰。(入围3匹)
  5. 头名排序第1的小组,全组入围。(入围4匹)

截止到现在,目前入围 10 匹马。 但是排序赛可以确认的是,排序第一的小组头名,必定是闪电中的闪电,马中的冠军。所以接下来不用比了。 所以,冠军锁定后,还剩余 9 匹马。

WX20220808-230607@2x.png

第三轮:9进3,1场或者2场( 决赛 )

这一轮的目的:决定前三名。 但是还剩9匹马,只能先把其中一匹马放下,然后再进行比赛。这里关键是:应该选择哪匹马留下。

目前最危险的排名是排序第4的小组头名(简称四马),因为它的名次上次比赛最靠后,已经知道有两匹马比它快。现在只要有一匹未出现在头名排赛中的马(简称黑马)比他快,他就会失败。 所以就可以先把他留下,让其他的先比,看下把它淘汰的情况会不会出现。

  • 淘汰场景 黑马出现在前两名。 说明干掉了比四马快的三马,三马不知道是否被淘汰,但是四马肯定没戏了,此时取前三名就可

WX20220808-230544@2x.png

  • 加赛场景 黑马出现在第三名 此时无法判断黑马和四马哪个最快,还需要再赛一场 黑马 VS 四马。

WX20220808-230356@2x.png

综上,这个赛制下,最少比10场,最多比11场,就能选出跑得最快的4匹马~

最后

实际的赛事中,情况更复杂一点,例如短道速滑。

  • 预赛 4人一组,每组前两名晋级(标记为Q),时间最快的四名小组第三名选手晋级(标记为q),唯如果有选手因比赛期间遭干扰而被裁判判进下一轮(标记为ADV),分配给时间最快小组第三名选手的晋级名额会相应减少。
  • 半准决赛 和预赛规则一致。
  • 半决赛 每组前两名及时间最快的小组第三名选手晋级A组决赛(标记为QA),唯如果有选手因比赛期间遭干扰而被裁判判进A组决赛(ADVA),则不会依据总时间分配A组决赛名额。剩馀五位成绩最好的选手晋级B组决赛(QB)。准决赛中犯规的选手无法晋级决赛。
  • 决赛: A组按速度,比出金银铜,B组排出名次。只有A组出现判罚导致奖牌不足时,才会轮到B组。

增加判罚,是因为实际赛制有更多规则,但是有人的地方就有江湖,例如韩国队选手啧啧啧。 增加时间最快的第三名选手,就是说最大概率确保死亡小组场景下公平性。

冬奥会的时候,看比赛倒是没咋注意规则,现在不由感慨数学真的无处不在啊。

另外,我在思考,面试官出这个题是为了考察啥呢?

拓展阅读

双败淘汰赛,瑞士制比赛,三败与多败淘汰赛的设计。


最简单的易懂的技术干货,好玩的事情,都会在公众号「浅浅同学的开发笔记」分享,快来呀~期待与你共同成长!