题目描述

有一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层???

题目解答

  • 方法一:

只用1个球就可以了,从2楼开始扔,如果直接摔碎,说明1层是最优解;没碎的话就一直扔,直到球从第x层扔下破碎,所以临界层就是x-1层。

在最坏情况下,这个方法需要扔100次。

  • 方法二:

采用类似于二分查找的方法,把鸡蛋从一半楼层(50层)往下扔。
如果第一枚鸡蛋,在50层碎了,第二枚鸡蛋,就从第1层开始扔,一层一层增长,一直扔到第49层。
如果第一枚鸡蛋在50层没碎了,则继续使用二分法,在剩余楼层的一半(75层)往下扔…

这个方法在最坏情况下,需要尝试50次。

  • 方法三:

每次肯定是由低的楼层往高的楼层尝试,直到在楼层f(k),第一个球已经碎掉了,记录上一个尝试的楼层为f(k-1),在此楼层,玻璃球不会碎,所以接下来要尝试 f(k-1)+1,f(k-1)+2,f(k-3)+3, …,直到有一个楼层碎了,这个楼层就是解啦,最坏的是到达f(k)-1 层。(核心思想)

所以可以进行区间的划分:划成10份。(1份10个),最多也就是扔不到20次。

最好情况是在第10层碎掉,尝试次数为 1 + 9 = 10次。
最坏的情况是在第100层碎掉,尝试次数为 10 + 9 = 19次。

不过,这里有一个小小的优化点,我们可以从15层开始扔,接下来从25层、35层扔…一直到95层。

这样最坏情况是在第95层碎掉,尝试次数为 9 + 9 = 18次。

  • 方法四:(最优)

既然第一步(确定临界段)的投掷数增加不可避免,我们就让第二步(确定临界层)的投掷数随着第一步的次数增加而减少。第一步的投掷数是一次一次增加的,那就让第二步的投掷数一次一次减少。

  假设第一次投掷的层数是f,转化成数学模型,f+(f-1)+…+2+1就表示从f开始猜,每次的增量都比前一次的曾量减1的情况下,最后猜的那个数(即 f+(f-1)+…+2+1 ),按照提议要求f+(f-1)+…+2+1>=99,即f(f+1)/2>=99(第一次测试点选择100层是无意义的,必然会碎,所以无任何测试价值,所以第一次测试点f是1-99中的一个数),解出结果等于14。丢下第一颗鸡蛋的楼层就分别是 14 , 27 , 39 , 50 , 60 , 69 , 77 ,84 , 90 , 95 , 99 。

前面为什么是f+(f-1)+…+2+1>=99?首先是分段确定临界段,保证不管玻璃球在哪一个临界段碎掉进行判断的次数都是一样的,所以就需要从下到上每一个段比上一个段的长度少1,同时所有段的长度总和是99(不需要是100 因为如果前面都没碎那么就一样时100了,也不需要在判断了)。

分析:

假设最优的尝试次数的x次,为什么第一次扔就要选择第x层呢?
这里的解释会有些烧脑,请小伙伴们坐稳扶好:

  • 假设第一次扔在第x+1层:

如果第一个玻璃球碎了,那么第二个玻璃球只能从第1层开始一层一层扔,一直扔到第x层。
这样一来,我们总共尝试了x+1次,和假设尝试x次相悖。由此可见,第一次扔的楼层必须小于x+1层。

  • 假设第一次扔在第x-1层:

如果第一个玻璃球碎了,那么第二个玻璃球只能从第1层开始一层一层扔,一直扔到第x-2层。
这样一来,我们总共尝试了x-2+1 = x-1次,虽然没有超出假设次数,但似乎有些过于保守。

  • 假设第一次扔在第x层:

如果第一个玻璃球碎了,那么第二个玻璃球只能从第1层开始一层一层扔,一直扔到第x-1层。
这样一来,我们总共尝试了x-1+1 = x次,刚刚好没有超出假设次数。

因此,要想尽量楼层跨度大一些,又要保证不超过假设的尝试次数x,那么第一次扔鸡蛋的最优选择就是第x层。

  首次选择14,那么最高可以判断到呢,按照上面的递减数列,14 , 27 , 39 , 50 , 60 , 69 , 77 ,84 , 90 , 95 , 99 ,102,104,105。一共是14次,最后是到105了,按照上面99和100的分析,虽然是14次猜,但是最后一个猜到了105,可知如果105还是不碎的话,那么肯定是106,106是铁定的了,不用猜了就知道,所以14次最大可以判断到106,这样15次的话就要从105开始猜,并且如果107层的话,那么需要15次。

  比如到27层,玻璃碎了,则要从15开始一层一层的尝试,比如26是解的话,那么猜的序列就是 14,27,15,16,17,18,19,20,21,22,23,24,25,26,一共14次。


备注:

这题一开始没看懂,一直在想为什么不能用二分法,二分法不是最多7次就可以搞定了吗,然后想了一会才意思到这题说的两个玻璃球是指,你最多只能用两个玻璃球来判断玻璃球碎掉临界的楼层,如果用二分法,第一步在50楼一扔碎掉了那么你这时候就糟了,你只能从第一层开始扔了,要进行50次判断,(如果你接着再在25扔,最后一颗玻璃球再碎掉你就没有球可以用了)所以二分法在这里并不好。

这时我们只能像上面一样想用第一颗球去确定一个区间,然后在区间内从区间底部网上进行判断就可以了

[益智]:从高楼抛玻璃球,用什么最优策略得到临界层?相关推荐

  1. 腾讯大楼抛玻璃球问题

    腾讯大楼抛玻璃球问题 问题 腾讯大厦有39层,你手里有两颗一抹一眼的玻璃珠.当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎.大厦有个临界楼层.低于它的楼层,往下扔玻璃珠,玻璃 ...

  2. 2018春招前端面试: 闯关记(精排精校) | 掘金技术征文

    前言 年末研发组解散失业, 选择回去学车了,也顺利拿到了驾照,最近回归大深圳,开始踏上漫漫的找工作之路. 拉勾上吊一百年不匹配, BOSS直聘日夜没反应. 题目范围涵盖我最近遇到的笔试题和面谈的(CS ...

  3. 2019春招前端面试: 闯关记(精排精校)

    前言 去年年末研发组解散失业, so选择回去学车了,也顺利拿到了驾照 最近回归大深圳....开始踏上漫漫的找工作之路; "拉勾上吊一百年不匹配!!!","BOSS直聘日夜 ...

  4. C/CPP基础练习题(二)简单循环(2 + 22 + 222…;斐波那契数列)

    简单循环 1. 求平均年龄 01星球有学长若干名, 给出每个学长的年龄, 求01星球学长的平均年龄, 保留小数点后两位 输入: 第一行: 整数n(1<n<100), 表示人数 之后n行: ...

  5. CVPR 2022 | “直面真实的世界”

    今天并没有什么论文解读,起这个标题只是为了让文章被审核,只是记录一些想说而又不能说的话. 踌躇许久,仍不知道要从何写起,如果直言不讳的叙述,大概率是不被审核通过的.一些文章不被"主流&quo ...

  6. java基础 - 1

    目录 第一章:Java开始 1 学习目标 1 Java历史 2 Java技术概述 3 Java技术的优点 3 Java虚拟机 4 类加载器 6 Windows环境变量 8 内容总结 13 独立实践 1 ...

  7. 两个玻璃球 测试极限高度

    一道有趣的智力题目: 已知,玻璃球从某高楼落到地面会摔碎,楼的最大高度为100层,给你两个玻璃球,请你最快的测出,能使玻璃球摔碎的最低楼层... 两个玻璃球 思路1:蛮力法 如果用蛮力法, 从1楼,2 ...

  8. 厉害了!蚂蚁 mPaaS:有人修建高楼,有人重构城市

    2018年2月,春运拉开序幕. 这是人类史上最大规模的迁徙活动,3.82亿人坐进车厢,被31万趟车次送往不同的目的地.如果有一台摄影机从高空对准中国大地,你会看到数千部列车在同一天内穿过山岭和水域,它 ...

  9. 对100层楼两个玻璃球测试问题的理解

    问题:有一座100层高的大楼和两个玻璃球(小球A和小球B),现在我们要通过在楼上扔玻璃球的方式来测试玻璃球的坚硬程度,已知从这座楼的某一层开始,往下扔玻璃球,玻璃球会碎,问最少需要多少次尝试,才能找到 ...

最新文章

  1. 本、硕、博的最大区别是什么?
  2. 来活儿了!赶紧检查下代码里有没有脏话...
  3. Deep Learning(深度学习)学习笔记整理系列之(四)
  4. 笔记——数据可视化02
  5. linux 系统安装mongodb数据库---方法1
  6. linux组的管理命令,linux 用户和组管理命令(示例代码)
  7. hdu 4970 killing monster 代代相传刷qq 不用线段树啦~
  8. Linux下的信号处理
  9. linux命令地址,[命令] Linux IP 命令 IP(管理地址)
  10. 精选 | 2018年1月R新包推荐
  11. leetcode探索二叉树(一)
  12. iperf详细使用方法
  13. 简洁明了的单例模式及其五种写法
  14. 你真的了解串口 (Serial)吗?
  15. 第九周项目——穷举法之三色球
  16. SUS2019迎新赛ret2moonWP
  17. 北京理工大学计算机考研资料汇总
  18. Android 自动化测试Monkey、Monkeyrunner
  19. JavaBean 是什么?JavaBeans 概念介绍
  20. 基于SSM实现农产品销售管理平台

热门文章

  1. 关于vmware中的某个虚拟机死机且无法关机问题的快速解决办法
  2. (47)Linux命令【free命令】
  3. eclipse目录找不见了
  4. vue入门级教程从零搭建一个vue项目
  5. ubuntu 远程root登录
  6. 当领导问:小王你的汇报写完了吗?
  7. js实现图片延迟加载
  8. linux 杀死僵尸进程
  9. MC9S12XET256MMA软件开发准备
  10. Excel教程实用技巧100条连载一