64匹马8个跑道问题

news/2024/11/8 2:50:33/

64匹马,8个跑道,假设马发挥稳定且没有体力问题,需要多少场可以决出所有名次(前4名/前8名)?

方法一:归并方法,49场

1). 把64匹马分成8组,先把每组排个序,共8场比赛。

2). 把这8组8匹马两两合并为4组16匹马的有序组,每次合并需要3场比赛。总共需要4次合并,总共需要赛 12 场;

  • 这里就是本题的关键所在:从其中任意选出两组,合并后的前4名肯定在两组的前4名这8匹马里,这8匹比一场就把两组的前4比出来了;对剩下的12马采取同样的策略,各取前4名,然后通过一场比赛决出整合后序列的5-8名,最后还剩8匹马,再为这8匹赛一次,这就是最后8名了。

3). 把4组16匹马再两两合并为2组32匹马,每次合并需要7场比赛。总共需要2次合并,总共需要赛 14 场。

  • 方法同上,实际上可以证明,两组有序的8k匹马合并成一组16k匹马,需要16k/4-1 =
    4k-1场比赛。(之前每场比赛决出靠前的4名,最后一场比赛一次决出最后的8名)

4). 把2组合并成1组,需要15场比赛。

这样的话,一共就是 8+4*3+2*7+1*15=49场比赛。

方法二:另一牛逼解答,37场。

先随意将马排成8*8阵型:

               01   02   03   04   05   06   07   0809   10   11   12   13   14   15   1617   18   19   20   21   22   23   2425   26   27   28   29   30   31   3233   34   35   36   37   38   39   4041   42   43   44   45   46   47   4849   50   51   52   53   54   55   5657   58   59   60   61   62   63   64

1、每一行赛一场,共八场。由对称性,不妨设每一行都是从左到右速度依次减慢。即01,09,17,25,33,41,49,57是八场的冠军。

2、下面说明,之后每4场总可以决出8个名次。

(1)各组冠军赛一场,(2)各组垫底赛一场,共两场,决出了第一名、第六十四名。且不妨设第一列各马速度由上至下依次变慢。即01是总冠军。
(3)现在,总第二名有两匹马候选,02,09。让02,09,10,17四匹马参与第三场。第三场另四匹呢?它们是有类似情况的最慢的几匹马。例如如果64是最慢的,第八列由快到慢依次是08,16,24,32,40,48,56,64,那么,让56,63,55,48四匹马参与第三场。由第三场的结果,总可以知道总第二、第六十三名。

  • 下面说明,不管02,09,10,17赛得的结果如何,总第三、四名的候选马不会超过四匹。

  • 若02获胜,那么总第三、四名的候选马只有03,04,09,以及10和17两匹中较快的一匹(这两匹已经赛过)

  • 若09获胜,那么第三名实际上已经知道了,是02、10或17中较快的一匹。若是02,则第四名候选马是03,10,17。若是10,则第四名候选马是02,11,17。若是17,则第四名候选马是02,10,18,25。

  • 于是,总第三、四名的候选马不会超过四匹。同理,总第六十二、六十一名的候选马也不会超过四匹。

(4)将上述总第三、四名的候选马、总第六十二、六十一名的候选马至多不超过八匹,赛一场,于是至此已经决出了前四名后四名共八个名次。

  • 不断重复上述过程,直至7个4场后决出了56个名次。

3、最后还剩8个名次,用一场解决。

总计:8+4*7+1=37场。


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

相关文章

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。 这…

硬件篇-配置

写在最前 这已经可以成为垃圾佬配置了。。。 机箱->239元 机箱选用的itx迷你机箱&#xff0c;为了后期nas方便拓展选了4盘位&#xff0c;该机箱还是比较符合我的预期的&#xff0c;颇有种麻雀虽小五脏俱全的感觉&#xff0c;机箱可以安装matx主板和itx主板&#xff0c;还是…

租房小程序源码推荐,让你的租房平台更有竞争力

为租房平台的从业者&#xff0c;你是否也曾为如何提高平台的竞争力而苦恼&#xff1f;租房小程序源码或许是一个不错的选择。 租房小程序源码是一种可以让你快速搭建一个专属的租房平台的工具&#xff0c;可以帮助你快速上线一个符合市场需求的租房平台。相较于从头开始开发一…

nginx超时相关参数

#读取http body的超时时间&#xff0c;单位秒&#xff0c;连接建立后&#xff0c;服务端接收body&#xff0c;规定时间内没收到&#xff0c;则超时&#xff0c;返回给客服端408&#xff08;request time out&#xff09; client_body_timeout 1000; #发送响应超时时间&…