动动脑筋:64匹马最少跑几次可以找出前四名?

news/2024/11/14 12:07:35/

前言

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

问题&分析

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

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

常规但非最优的解法

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

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

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

在这里插入图片描述

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

最少比赛次数解法

第一轮:64进32,共1场( 小组赛)
和常规组一样,每轮8个,进4个。
在这里插入图片描述

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

排序后可以推断

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

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

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

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

拓展阅读

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


http://www.ppmy.cn/news/169525.html

相关文章

day4 Python笔记总结

day4 Python笔记总结 在经过上节课对循环语句的学习,对循环的用法有了基础性的学习。对于学习嵌套循环的对比打下了基础。 一、嵌套的循环对比 import time嵌套的循环对比作用是:直接借用别人实现好的功能来解决你遇到的问题。在Python将1970年1月1日…

【实践】python公考数学

❤判断推理 ❤数理关系 ❤资料分析 区分确定和不定信息。不定信息有&#xff1a;假言、不相容选言、相容选言、特称&#xff08;有的&#xff09;。 从重复信息入手。比如某词项出现两次。 分情况讨论&#xff1a;当a>0当a0当a<0。 涉及百分数的题&#xff0c;当加和超过…

python练习题5

基础题 依次输入两个整数&#xff0c;如果两个数相减的结果为奇数则输出该结果&#xff0c;否则输出提示信息结果不是奇数。 num1 int(input("请输入第一个整数&#xff1a;")) num2 int(input("请输入第二个整数&#xff1a;")) num3 num1 - num2 if…

百马百担问题:有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,问大,中,小马各有多少?

算法设计与分析习题4_6 百马百担问题&#xff1a;有100匹马&#xff0c;驮100担货&#xff0c;大马驮3担&#xff0c;中马驮2担&#xff0c;两匹小马驮1担&#xff0c;问大&#xff0c;中&#xff0c;小马各有多少&#xff1f; #include <stdio.h> int main() {int a,b,…

制作简单进销存管理系统(C#)

实验三&#xff1a;制作简单进销存管理系统 任务要求&#xff1a; 在进销存管理系统中&#xff0c;商品的库存信息有很多种类&#xff0c;比如商品型号、商品名称、商品库存量等。在面向对象编程中&#xff0c;这些商品的信息可以存储到属性中&#xff0c;然后当需要使用这些…

java系统学习(五) --------java类和对象的定义

什么是类 类是客观存在的,抽象的,概念的东西。 什么是对象 对象是具体的,实际的,代表一个事物。例如:车是一个类,汽车,自行车就是它的对象。 关于类与对象的描述:类是对象的模版,对象是类的一个个体。 Java中定义类的方法

[Java入门] 百马百担问题

[Java入门] 百马百担问题 白马白担问题&#xff1a;100 匹马驮 100 担货物&#xff0c;其中大马驮 3 担货&#xff0c;中马驮 2 担&#xff0c;两匹小马驮 1 担。问共有大、中、小马各多少匹&#xff1f;编程实现求解的算法。 类似百钱买百鸡 public class Test {public stat…

用python解决百马百担问题_利用C语言实现“百马百担”问题方法示例

前言 百马百担问题,有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,问共有多少种驮法?且各种驮法中大、中、小马各多少匹? 【分析】 1、定义整型变量m、n、k分别存放大马匹数、中马匹数、小马匹数; 2、定义整型变量sum存放共有几种驮法,且sum赋初值为0; 3、…