且看题:

有100层楼,已知从某层扔下玻璃球会碎,给你两个玻璃球,请用最优策略实验出临界的破碎楼层

注意题,是给出最优实验策略,我们可不能拿一个小球从一层开始扔,然后一层一层往上加,这样的话最坏的情况下会扔99次(因为99层不管碎没碎,我们都知道结果了),而且还浪费了一个球。
那既然有两个球,可不可以用简单的折半法呢,比如50层扔一个,没碎的话,用另一个球从51层往上扔,最坏的情况下是1+49=50次,如果碎了的话,我们再折半,从25层扔另一个球,嗯,又碎了,然后呢,然后没球了(┬_┬)
可见以上两种扔法都不能解出此题,但仔细想想,以上两种扔法都有一个共同点,也是解此题的关键,即:两次扔球的区间间隔!第一种扔法看似么有区间,其实可以看作区间为0,第二种区间为50,此题求最优策略(注意不是最少),可以理解为无论临界楼层是几层,这种策略的最多扔球次数都是一样的,那么我们的扔球区间该怎么选呢?
假设我们第一次扔球从第n层扔:

  1. 如果碎了,那么第二颗球就应该从第一层往上扔,最坏次数为1 +(n - 2)- 1 + 1 = n - 1次,解释一下,即:第一次扔球次数 1加上本次实验最高层减去最底层并加1,n - 2层是最后一次实验的楼层,因为已知n层碎了,当扔到第n-2层的时候不管碎没碎我们都知道结果了,至于为什么最高层减去最低层后要加1,举个简单的例子,3-5之间会实验多少次,[3,4,5]层 = 5-3+1次。
  2. 如果没碎,那么接着用第一颗试,第二次扔的楼层是多少呢?我们理想的结果是不管哪层是临界层,扔的总次数都是一样 的,所以我们第二次往上选楼层的时候就得在第一次的楼层上减1,因为第一次扔球已经占用一次扔球次数,所以第二次扔的楼层为n +(n-1)层。
  3. 如果第二次扔球碎了,那么第二颗球应该从 n+1层开始往上扔一直扔到 n +(n-1) - 2 层,最坏的情况下的总次数为 2 + ((n +(n-1) - 2) - (n + 1) + 1)= n - 1次,可以看到最坏次数和上次一样!
  4. 如果第一颗球第二次选择的楼层还没碎呢?那么同理,第一颗球第三次选择的楼层应该为n +(n-1)+(n-2)层。
  5. 我们继续以上推理,当第一颗球一直都没碎的情况下,我们继续往上选择的楼层会变成这个样子:
    n +(n-1)+(n-2)+(n-3)+ ··· + 2 + 1
    而到最后我们选择的楼层一定已经大于等于最高层,因为最后的那个+1存在,所以才会有大于,而为什么会要这个+1,我们是为了将其凑整成一个数列,以上数列即为从1一直加到n,而这个数列与楼层的关系可以简化成:
    n(n+1)2\frac {n(n+1)}{2}2n(n+1)​ >= 100 即:n(n + 1) >= 200
    由此可解,n >=14 即最优解的第一次扔球应该从第14层扔下玻璃球,下面给出具体扔法:
    '14  1  2  3  4  5  6  7  8  9 10 11 12','14 27 15 16 17 18 19 20 21 22 23 24 25','14 27 39 28 29 30 31 32 33 34 35 36 37','14 27 39 50 40 41 42 43 44 45 46 47 48','14 27 39 50 60 51 52 53 54 55 56 57 58','14 27 39 50 60 69 61 62 63 64 65 66 67','14 27 39 50 60 69 77 70 71 72 73 74 75','14 27 39 50 60 69 77 84 78 79 80 81 82','14 27 39 50 60 69 77 84 90 85 86 87 88','14 27 39 50 60 69 77 84 90 95 91 92 93','14 27 39 50 60 69 77 84 90 95 99 96 97',

由上可以看出,最优策略为第一次扔的楼层为14层,最多扔13次。

面试算法03-高楼扔球求临界破碎楼层相关推荐

  1. 100层楼2个鸡蛋求最低破碎楼层与信息论

    100层楼2个鸡蛋求最低破碎楼层经典算法可以参考  http://blog.sina.com.cn/s/blog_6c813dbd0101bh98.html 这篇文档我们从更高的视角-信息论的角度去看 ...

  2. android 求数组最大值,面试算法知识梳理(7) - 数组第四部分

    面试算法代码知识梳理系列 一.概要 本文介绍了有关数组的算法第四部分的Java代码实现,所有代码均可通过 在线编译器 直接运行,算法目录: 求数组当中的最长递增子序列(求数组当中的最长递减子序列) 区 ...

  3. 每日一道算法题:高楼扔鸡蛋问题(动态规划问题)

    题目是这样:你面前有一栋从 1 到N共N层的楼,然后给你K个鸡蛋(K至少为 1).现在确定这栋楼存在楼层0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于F的楼层都会碎,低 ...

  4. java动态规划鸡蛋问题_动态规划系列/高楼扔鸡蛋问题.md · lipengfei/fucking-algorithm - Gitee.com...

    # 经典动态规划问题:高楼扔鸡蛋 今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼.国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得扔鸡蛋 ...

  5. 力扣高频算法php_互联网公司最常见的面试算法题有哪些?

    很多时候,你即使提前复习了这些最常见的面试算法题,你依旧无法通过算法面试! 为什么?你在提前准备复习的时候,在网上找了半天相应题目的分析文章,但你看了就是不懂. 你在面试的时候,卡壳了,一时间忘了怎么 ...

  6. 牛客网《BAT面试算法精品课》学习笔记

    目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...

  7. 一道关于扔球/扔鸡蛋/摔手机的DP问题(蓝桥杯题目/面试题)

    注:问题的解决感谢广东技术师范学院林智勇老师的指导 (一)问题描述 给定N层楼和i个球.用i个球检测在这N层楼中的某一层t球扔下楼时不碎,而在t+1层球扔下楼时会碎,则t层称为最高安全层.求用i个球一 ...

  8. 字节跳动面试算法题目以及答案

    题目来源于牛客 https://www.nowcoder.com/discuss/455003?type=post&order=time&pos=&page=2&cha ...

  9. 谷歌创造ImageNet1K新纪录:性能不佳的微调模型不要扔,求一下平均权重就能提升性能...

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 丰色 发自 凹非寺 量子位 | 公众号 QbitAI 如何最大限度地 ...

最新文章

  1. 材料成型计算机模拟第三版,材料成型计算机模拟考试复习资料.doc
  2. 在浏览器地址栏按回车、F5、Ctrl+F5刷新网页的区别--转
  3. python 删除csv第一行_python 标准库学习之 csv
  4. [html] 进入编辑页面时,如何把光标聚焦到第一个input?
  5. Eclipse Rcp系列 http://www.blogjava.net/dreamstone/archive/2007/02/08/98706.html
  6. redis 存入mysql_数据存到redis 过后怎么处理放到数据库?
  7. C++Primer Plus第6版C Primer Plus第6版 中文版免费分享啦
  8. python 文件批量转换格式_python实现快速文件格式批量转换的方法
  9. pdf怎么打开上次看到的地方_ppt如何转pdf?俩种方法轻松搞定
  10. 翻译: 2.2 Pandas Pytorch 数据预处理 深入神经网络
  11. 卷积码(Convolutional Code)
  12. 高速充电手机电池问世 充满电只需10秒
  13. windows控制面板卸载程序失败(等待。。。)
  14. Counterfactual Zero-Shot and Open-Set Visual Recognition
  15. history路由下,Whitelabel Error Page错误
  16. 题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:2021年焊工(初级)考试资料为正在备考焊工(初级)操作证的学员准备的理论考试专题,每个月更新的焊工(初级)免费试题祝您顺利通过
  17. SVGDeveloper制作矢量地图教程详解
  18. 软件测试周刊(第59期):觉得自己生活的很好吗?为什么视而不见?
  19. 车载终端项目GPS模块算法详述
  20. 运维之道 | Nginx rewrite 规则详解

热门文章

  1. java计算机毕业设计高校体育场馆管理源码+mysql数据库+系统+lw文档+部署
  2. 深度学习(二)---算法岗面试题
  3. 单片机原理与应用实验——串口(C语言),使用串口发送或接收数据,定时器1作为波特率发生器
  4. 中国经济稳中有进态势依旧
  5. 程序员和工程师有什么不一样?
  6. Keil MDK终于免费了,并且没有代码大小限制~
  7. 如何把一张图片放到网页上或者如何在浏览器查看一张图片
  8. 小数化分数c++(附做法数学证明)
  9. 3. node.js 异步式I/O或非阻塞式I/O
  10. c#通联支付demo_通联支付接口示例源码(.net/php/java)