[益智]:从高楼抛玻璃球,用什么最优策略得到临界层?
题目描述
有一栋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扔,最后一颗玻璃球再碎掉你就没有球可以用了)所以二分法在这里并不好。
这时我们只能像上面一样想用第一颗球去确定一个区间,然后在区间内从区间底部网上进行判断就可以了
[益智]:从高楼抛玻璃球,用什么最优策略得到临界层?相关推荐
- 腾讯大楼抛玻璃球问题
腾讯大楼抛玻璃球问题 问题 腾讯大厦有39层,你手里有两颗一抹一眼的玻璃珠.当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎.大厦有个临界楼层.低于它的楼层,往下扔玻璃珠,玻璃 ...
- 2018春招前端面试: 闯关记(精排精校) | 掘金技术征文
前言 年末研发组解散失业, 选择回去学车了,也顺利拿到了驾照,最近回归大深圳,开始踏上漫漫的找工作之路. 拉勾上吊一百年不匹配, BOSS直聘日夜没反应. 题目范围涵盖我最近遇到的笔试题和面谈的(CS ...
- 2019春招前端面试: 闯关记(精排精校)
前言 去年年末研发组解散失业, so选择回去学车了,也顺利拿到了驾照 最近回归大深圳....开始踏上漫漫的找工作之路; "拉勾上吊一百年不匹配!!!","BOSS直聘日夜 ...
- C/CPP基础练习题(二)简单循环(2 + 22 + 222…;斐波那契数列)
简单循环 1. 求平均年龄 01星球有学长若干名, 给出每个学长的年龄, 求01星球学长的平均年龄, 保留小数点后两位 输入: 第一行: 整数n(1<n<100), 表示人数 之后n行: ...
- CVPR 2022 | “直面真实的世界”
今天并没有什么论文解读,起这个标题只是为了让文章被审核,只是记录一些想说而又不能说的话. 踌躇许久,仍不知道要从何写起,如果直言不讳的叙述,大概率是不被审核通过的.一些文章不被"主流&quo ...
- java基础 - 1
目录 第一章:Java开始 1 学习目标 1 Java历史 2 Java技术概述 3 Java技术的优点 3 Java虚拟机 4 类加载器 6 Windows环境变量 8 内容总结 13 独立实践 1 ...
- 两个玻璃球 测试极限高度
一道有趣的智力题目: 已知,玻璃球从某高楼落到地面会摔碎,楼的最大高度为100层,给你两个玻璃球,请你最快的测出,能使玻璃球摔碎的最低楼层... 两个玻璃球 思路1:蛮力法 如果用蛮力法, 从1楼,2 ...
- 厉害了!蚂蚁 mPaaS:有人修建高楼,有人重构城市
2018年2月,春运拉开序幕. 这是人类史上最大规模的迁徙活动,3.82亿人坐进车厢,被31万趟车次送往不同的目的地.如果有一台摄影机从高空对准中国大地,你会看到数千部列车在同一天内穿过山岭和水域,它 ...
- 对100层楼两个玻璃球测试问题的理解
问题:有一座100层高的大楼和两个玻璃球(小球A和小球B),现在我们要通过在楼上扔玻璃球的方式来测试玻璃球的坚硬程度,已知从这座楼的某一层开始,往下扔玻璃球,玻璃球会碎,问最少需要多少次尝试,才能找到 ...
最新文章
- 本、硕、博的最大区别是什么?
- 来活儿了!赶紧检查下代码里有没有脏话...
- Deep Learning(深度学习)学习笔记整理系列之(四)
- 笔记——数据可视化02
- linux 系统安装mongodb数据库---方法1
- linux组的管理命令,linux 用户和组管理命令(示例代码)
- hdu 4970 killing monster 代代相传刷qq 不用线段树啦~
- Linux下的信号处理
- linux命令地址,[命令] Linux IP 命令 IP(管理地址)
- 精选 | 2018年1月R新包推荐
- leetcode探索二叉树(一)
- iperf详细使用方法
- 简洁明了的单例模式及其五种写法
- 你真的了解串口 (Serial)吗?
- 第九周项目——穷举法之三色球
- SUS2019迎新赛ret2moonWP
- 北京理工大学计算机考研资料汇总
- Android 自动化测试Monkey、Monkeyrunner
- JavaBean 是什么?JavaBeans 概念介绍
- 基于SSM实现农产品销售管理平台