阿里巴巴面试算法题目:25匹赛马,5个跑道,也就是说每次有5匹马可以同时比赛。问最少比赛多少次可以知道跑得最快的5匹马?

将马分成A、B、C、D、E五组。 第1-5次比赛:各组分别进行比赛,决出各组名次 A1、A2、A3、A4、A5, B1、B2、B3、B4、B5, 。。。。 。。。。。。E4、E5。 第6次比赛:A1、B1、C1、D1、E1, 第一名是跑的最快的。 第7次比赛:将上次第一名所在组的下一号马再和剩余的4匹1号马比赛, 第一名是跑的第二快的马,由于只有4个名额,所以跑的最慢的马和所在组剩余的马全部被淘汰。 第8次比赛:将上次第一名所在组的下一号马、上次第二名所在组的下一号马和剩余的3匹马比赛, 第一名是跑的第三快的马,由于只有3个名额,所以跑的最慢的两匹马和所在组剩余的马全部被淘汰。 在剩下的比赛中分别淘汰慢的,将排名稍后的加进来比赛,最多跑到第10次就可以选出最快的5匹马。如果在某一次比赛中排名前几的是同一组的且和已经选出的马加一起大于等于5,就可以提前决出前5名。 所以8-10次就可以选出最快的5匹马。

一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问,最少得比多少场才能知道跑得最快的5匹马?(不能使用撞大运的算法

很明显这是一个算法题,网上有很多贴子在讨论这个问题,不过都没有给出一个明确的答案。我想了想,想到下面的一个算法:

1)分成5组A,B,C,D,E,比五场。然后根据每场结果分别给这五组内的五匹马排序(从快到慢)。
2)每组的头名再赛一场,取走第一名,然后该组第二名顶上。
3)重复第二步,直到选出前5名。

这个算法是比较笨的算法,总计需要赛10次,这个算法应该是万无一失的。现在的问题的就,如何优化这个算法,想了想,的确是有优化的空间的。也就是说,是可以少于10次的。

想了一想,上面的那个算法自从第6次开始就使用5个排序数组的头名做“冒泡法”,总是挑一个最优秀的出来,其实,在第6次以后除了挑出最优秀的,我们还可以在每次比赛后淘汰一些速度不行的,淘汰的马匹数自然会比选出的更多,所以,一方面在找,另一方面在淘汰,找出前5名的速度应该会更快。

比如:我们假设比赛完第六场后,我们得到下面的排序:(每组排序是——快马从左到右,各组头名的排序是——快马从上到下)

A组 A1 A2 A3 A4 A5
B组 B1 B2 B3 B4 B5
C组 C1 C2 C3 C4 C5
D组 D1 D2 D3 D4 D5
E组 E1 E2 E3 E4 E5

这样,我们不但知道,A1是25匹马里最快的马,而且我们可以淘汰近一半的马,比如E2,E3,E4,E5就可以全部淘汰了,为什么呢,因为比E2快的马有A1,B1,C1,D1,E1这五匹马,所以,E2后面的马是无法进入前五名了;同理,D3和其后面的也进入不了前5;同理,C4,C5,B5都可以淘汰。

于是,在第六轮后我们可以得知,除了A1外的Top 4必然在下面这些马中:

A组  A2 A3 A4 A5
B组 B1 B2 B3 B4 
C组 C1 C2 C3 
D组 D1 D2 
E组 E1

接下来的过程应该不必我多说了。重复前面的方法,尽可能淘汰无法进前N名的马,于是后面的马就越来越少,你所需要的比赛也会越来越少。

那么,对于这个题,聪明的你知道最少要比赛几场了吗?最少8场。

举一反三,如果有64匹马,8个赛道呢?不失一般性,如果有N匹马,M个赛道呢?N = M*M,那么公式是什么呢?

期待你的答案!

马场上只有5条跑道,欲从25匹马中选出3匹最快的,求最少比赛次数

每次只能有5匹马参赛,故先将25匹马分成5组(A, B, C, D, E)。

这5组进行组内比赛,此时进行了5场比赛,分别得出5组内的排名,(A1, A2, A3, A4, A5), (B1, B2, B3, B4, B5), (C1, C2, C3, C4, C5), (D1, D2, D3, D4, D5), (E1, E2, E3, E4, E5)。

第6场比赛,(A1, B1, C1, D1, E1),这5匹马组成一组比赛,得到一个排名,为看起来方便,假设排名为(A1, B1, C1, D1, E1),此轮比赛得出最快的一匹马A1。

这里作出分析,因只选取25匹马中的3匹最快的马,所以下一场比赛的名额应该是有可能进入前三的马,而且只剩两个名额,因A1胜出,所以A组中(A2, A3)可能会是前三的马(A2, A3均快于B1),B组中(B1, B2)有可能是(B1, B2均快于A2, C1),C组中只有C1可能是(C1快于A2, B2)。

第7场比赛,(A2, A3, B1, B2, C1),选出最快的两匹马,与A1组合,则为最快的三匹马。

本题答案:7场

【刷题-每天一算法】赛马相关推荐

  1. 刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java)

    刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java) https://www.lanqiao.cn/problems/234/learning/ http://lx.lanqia ...

  2. LeetCode刷题笔记(算法思想 四)

    LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...

  3. 【剑指offer刷题】排序算法

    记录在Leetcode刷<剑指offer>的笔记,希望提高自己的算法基础和编程水平.这一篇文章刷的是排序算法的题目集合,在CSDN做一下记录,随时更新,一起学习吧. 刷题链接:https: ...

  4. Leetcode题目分类指南(单独刷题或学习算法书籍配合使用)

    Leetcode题目分类指南 笔者在学习<算法导论>同时,希望能够配合Leetcode的题目进行分类模块化练习,该分类为笔者自己根据做题学习经验,结合<算法导论>的内容,给出L ...

  5. python画图、python小游戏、python刷题、python算法、python编程与数学

    python画图系列整理 python画图系列整理-CSDN博客 python游戏入门书籍推荐 python游戏入门书籍推荐_pygame书籍推荐_dllglvzhenfeng的博客-CSDN博客 p ...

  6. 师兄刷题笔记、算法小抄、面试突击版必备资源,帮你走上人生巅峰

    前言 最近有很多朋友问我刷题.面试有没有什么好的资源.今天就给大家找了三个棒的开源资源,内容非常硬核,很多人靠着它进了大厂. 不绕弯子,三个分别是谷歌师兄<谷歌大佬的刷题笔记>,东哥< ...

  7. LeetCode力扣刷题——千奇百怪的排序算法

    排序算法 一.常见的排序算法         以下是一些最基本的排序算法.虽然在 C++ 里可以通过 std::sort() 快速排序,而且刷题时很少需要自己手写排序算法,但是熟习各种排序算法可以加深 ...

  8. 力扣刷题记录-回溯算法相关题目

    首先介绍一下回溯算法 回溯通常在递归函数中体现,本质也是一种暴力的搜索方法,但可以解决一些用for循环暴力解决不了的问题,其应用有: 1.组合问题: 例:1 2 3 4这些数中找出组合为2的组合,有1 ...

  9. leetcode刷题记录:算法(九)动态规划

    动态规划(Dynamic Programming,DP) 根据百度百科上的定义: 动态规划是求解决策过程最优化的过程 然后各个博客里对动态规划的描述为: 将需要求解的大问题,分解为一个个的小问题,并在 ...

  10. LeetCode面试刷题技巧- 贪心算法题习题集

    今天介绍一种解决常规的贪心策略或者字典排序的题目的通用解题方法. 第一题,leetcode中等难度题目 先来一道简单的字典序排列的问题,这个题目我这里不会用最优解来解决这个问题,这个是leetcode ...

最新文章

  1. 如何停止一个正在运行的线程?
  2. Hud 敌兵布阵 --线段树的插点问线
  3. 深度学习模型如何缩小到可以放到微处理器呢?
  4. python持久层框架_想设计一个Python的持久层框架
  5. 户频繁点击发送ajax请求
  6. aac fhg lc哪一个模式_旅游没电别发愁,一个充电头,助你游遍全球
  7. Linux 性能检查命令总结
  8. ckeditor与ckfinder的使用方法 .NET (转载)
  9. php进阶课程,php进阶教程学习
  10. php会员整合,会员整合Ucenter/Discuz!/PHPWind教程
  11. CVPR 2019 | 西北工业大学开源拥挤人群数据集生成工具,大幅提升算法精度
  12. 未能加载nStuff.ScriptSharp.Web.dll
  13. Matlab学习笔记 figure函数
  14. 使用ExtendSim进行水管理、可持续性和环境仿真建模
  15. android炫彩跑马灯特效,盘点一下那些自带酷炫跑马灯效果的手机,最后一款几乎没人知道...
  16. lumion计算机丢失string,Lumion计算机丢失string
  17. 一文搞懂mysql单引号,双引号,反引号的使用
  18. 【docker】win10系统下docker容器安装及使用(二):docker通过commit及dockerfile进行创建
  19. C++:实现量化存在净额结算协议的交易对手风险下的利率互换估值公式测试实例
  20. 伪静态与重定向--RewriteBase

热门文章

  1. 语音合成芯片——SYN6658
  2. k8s core-dns 解析域名异常
  3. 辞旧迎新又一年(18年年终总结)
  4. EUI插件服务器负载显示不兼容,EUI - 魔兽世界最贴心的插件
  5. Beginning Lua with World of Warcraft Add-ons第三章翻译总结及一些工具
  6. 图片隐写,盲水印,加密logo
  7. 南师大GIS考研数据库2019年第五题
  8. 毕设过程中使用WPS的自定义生成目录中混入图片等非相关元素
  9. 谷歌企业文化建设分析
  10. python统计群聊话痨、活跃日期和活跃时段