64匹马8条道找到最快4匹最少需要几次

news/2024/11/8 2:41:55/

64匹马赛跑问题

这题是我之前一段时间在网上看到的一道面试的思维题,题目的描述大致如下:

现有64匹马,8条赛道,如何用最少的比较次数找出最快的4匹

刚看到这道题时,我在想如果有计时器的话,64匹马分8组跑,找出时间最短的4匹就可以了吧,这样的话就只需要进行1次对于时间长短的比较。而严格来说的话分8组跑可以算是8次比较,那么最少就算8次吧。可是题目的解答并没有那么简单,因为按照其他人的说法,这次赛跑并没有“计时器”,也就无法直接得知8组间最快4匹是哪4匹

那么这就需要思维拐下弯了

首先先让64匹马分8组进行赛跑。此时进行了8次比较
接着让8组中每组的第1名跑一次,按照跑出来的名次对刚刚分出的8组进行排序,组别的名次和该组第1名本次赛跑的名次一致。此时进行了9次比较

完成了以上的8组排序后,由于需要决出的是最快的4匹,那么最快的4匹不可能是在排名后4位的组别中产生(后4组的第1名都排不到前4,更不要说后4组中其他名次的马了),所以后4组所有马舍去
这时剩下了前4组的32匹马,而由于需要的是最最快的4匹马,那么前4组中每组的后4名也不会是最快的4匹(既然都不是本组的前4名,就更不可能是所有马中的前4名了),所以前4组中所有后4名的马舍去,这时剩下了16匹马
这时看到排名第4的组别中的前四名,由于该组的第1名仅在所有组第1名的马中排第4,那么第4组的2到4名就不可能是前4,所以可以将第4组中第2到4名的马舍去
对于第3组的前4名来说,由于该组的第1名可以排到所有组第1名的马中的第3,那么跟随其后的该组第2名就有可能是第4,但其后的3、4名就不可能是所有马中的前4了,所以可以将第3组中3、4名的马舍去
对于第2组的分析也是类似:既然第2组的第1名可以在所有组第1名排到第2,那么跟随其后的该组第2、3名就有可能是所有马中的第3、4名,而该组的第4名就不可能是所有马的前4,所以舍去第2组中4名的马
对于第1组的剩余4匹马,由于该组第1名是所有组第1最快的,所以其后3匹马可能是所有马前4中的马,不用舍去
此时剩余的马匹数量为10匹(1组4匹,2组3匹,3组2匹、4组1匹)

由于第1组的第1名是所有第1名中最快的,可以确定第1组的第1名就是所有64匹马中最快的了,也就是说第1名确定下来为第1组的第1名,那么就需要在剩余9匹马中决出前3

由于只有8条赛道,为了尽量减少比较次数,将剩余9匹中除去第1组第4名的8匹进行1次比较,根据第1组第3名的名次再决定是否将第1组第4名与其他马比较(此时是第10次比较):
如果经过这次比较,第1组第3名名次在前2名,那么第1组第4名就有可能是剩余9匹马的前3名,这就需要将第1组第4名和第10次比较后非第1的7匹马比较,这8匹马决出的前2名就是剩余的所有马中的第3、第4名(此时是第11次比较
如果经过第10次比较,第1组第3名没有在前2名,则不需要让第1组第4名参与比较,也就不需要第11次比较了,此时第10次比较的前3名就是所有马中的第2到4名

综上,需要至少10或11次的比较


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

相关文章

c语言 100匹马 编程,编程,百马百担有关问题,有100匹马,驮100担货,大马驮三担,中马驮2担,两匹小马驮一担,求大、中、小各多少匹...

编程,百马百担问题,有100匹马,驮100担货,大马驮三担,中马驮2担,两匹小马驮一担,求大、中、小各多少匹? 编程,百马百担问题,有100匹马,驮100担货,大马驮三担,中马驮2担,两匹小马驮一担,求大、中、小各多少匹? 分享到: ------解决方案-------------------- 数学…

腾讯面试:赛马问题【超详细图解】64匹马,8个赛道,找出前4名最少比赛多少场?

目录 常规思路正确答案解析第一轮:8场第二轮:1场第三轮:1场或2场总结 引子:在面试大厂时,怎么也没想到会考我一道脑筋急转弯。 问题:有64匹马和8条跑道,每次只允许最多8匹马同时比赛&#xff08…

64匹马8个跑道问题

64匹马,8个跑道,假设马发挥稳定且没有体力问题,需要多少场可以决出所有名次(前4名/前8名)? 方法一:归并方法,49场 1). 把64匹马分成8组,先把每组排个序&…

BAT 面试题:25匹马,5个跑道,每个跑道最多能有1匹马进行比赛,最少比多少次能比出前3名?前5名?

写在前面:最近在刷面试题的过程中遇到这么一道题,感觉解读题目的角度很多,这里介绍自己的做法。注意:本文并不是参考答案,只是为大家在面试的时候多提供一条思路,或许可以获得面试官的青睐。 25匹马&#x…

【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)

目录 一、双向链表二、node(int index) 根据索引找节点三、clear()四、add(int, E)五、remove(int index)六、双向链表和单链表七、双向链表和动态数组八、jdk 官方的 LinkedList 的 clear() 方法 一、双向链表 🎁 单链表的节点中只有一个 next 指针引用…

4141:砝码称重

#include<iostream> using namespace std; int total0; int dp[1000]; int num[6],sum; int kg[6]{1,2,3,5,10,20}; int main(void){ for(int i0;i<6;i){ cin>>num[i]; sumnum[i]*kg[i]; } dp[0]1; //对于第i种砝码&#xff0c;枚…

java8函数式接口使用详解

在Java8之前&#xff0c;我们通常使用匿名内部类来实现接口的抽象方法&#xff0c;例如&#xff1a; //定义一个接口 interface Greeting {void sayHello(String name); }//使用匿名内部类实现接口 Greeting greeting new Greeting() {Overridepublic void sayHello(String n…

pcie转m2装系统win10_NVMe SSD安装Win10系统详解:小白秒懂

最近有不少小伙伴问我&#xff0c;他们自己买了个PCIe SSD&#xff0c;不知道怎么装系统。如果一个人问还好&#xff0c;但是如果很多人问同样的问题&#xff0c;那某冬索性写个PCIe SSD装系统的教程给大家看好了。 要装系统进PCIe SSD&#xff0c;当然我们得有个PCIe SSD。 这…