美文网首页益智问题
抛瓶子问题的解法

抛瓶子问题的解法

作者: SpaceCat | 来源:发表于2018-12-16 15:59 被阅读18次

最近,看了一道看似简单的问题,抛瓶子。题目的描述是这样的:

一栋楼高为100层,有两个瓶子,如何用最少的实验次数(从某层楼抛下一个瓶子,看会不会碎,记为一次实验。)确保测出瓶子从哪一层(最小层数)摔下来会碎?

这个问题,看似简单,其实并不是,下面简单的说下几种思路。

二分搜索

这道题,我的第一反应是二分搜索。
首先用第一个瓶子,在第50层楼实验,如果瓶子碎了,证明瓶子在1-49层范围内就有可能碎。接下来,就可以用第二个瓶子,从第一层开始,逐层向上试验,直到瓶子破碎,就找到了摔碎瓶子的最小层数。如果实验到底49层,瓶子还没碎,就说明摔碎第一个瓶子的第50层是瓶子摔碎的最小层数。这种情况下,最坏共需要实验50次才能得到答案。
如果第一个瓶子在第50层没有摔碎,那么就继续在第75层实验。如果碎了,就接着用第二个瓶子检查第51到第74层,和前面一种情况中,用第二个瓶子检查第1到49层类似。这种情况下,最坏共需要24+1+1次,也就是26次才能得到答案。
如果在第75层实验,第一个瓶子还没有碎,那么就应该继续在75+(100-75)/2=87层实验。。。
后面的情况和前面的大致类似。这种思路下,最多的实验次数,就出现在刚开始在第50层实验时第一个瓶子破碎的情况,总共需要50次实验才能够得出答案。显然,这个答案不是那么让人满意。

简单的思路

另外,有一种,更为简单的思路,从第2层开始,每两层用第一个瓶子做一次实验,如果碎了,用第二个瓶子在相邻往下的一层做实验即可得出结论。如果没碎,继续往上两层,用第一个瓶子做实验,直到顶楼或者瓶子破碎。这样,也能够得出结果。最坏的情况下,第一个瓶子在第100层摔碎,第二个瓶子要在第100层相邻往下的一层,也就是99层,做实验,如果碎了答案就是99,如果没碎,答案就是100。这样,最坏的情况下,我们需要实验的次数是50+1=51次。
从这个方案来看,实际上,第一个瓶子主要是用来确定范围,第二个瓶子用来精准定位,这样,如果稍微调整下第一个瓶子实验的跨度,就能对这个方案的开销进行优化。比如,每两层用第一个瓶子做一次实验,改成每3层做一次实验。这样的话,最坏情况下所需要的实验次数就是100/3+2=35次。
可以发现,这里调整第一个瓶子实验的跨度,可以优化实验的效率。如果我们假设第一个瓶子实验的跨度为每x层实验一次,最终的实验次数为y,那么就会有:

"函数关系"

这个函数的图像如下:


"函数图像"

不难发现,这种方案下最小的实验次数出现在x为10的时候,这时候的试验次数为19。
到这里,得到的结果已经比前面二分的思路,优化了好多,然而,这里并不是最优的结论,因为这里做了一个限制,就是说,第一个瓶子在各次实验中的跨度是一样的。如果去掉这个限制,说不定会有更好的解决思路。

更好的解决思路

相关文章

  • 抛瓶子问题的解法

    最近,看了一道看似简单的问题,抛瓶子。题目的描述是这样的: 一栋楼高为100层,有两个瓶子,如何用最少的实验次数(...

  • 蓝桥杯:交换瓶子--Python解法

    问题描述: 有N个瓶子,编号 1 ~ N,放在架子上。比如有5个瓶子:2 1 3 5 4 要求每次拿起2个瓶子,交...

  • 用栈代替递归之汉诺塔问题

    问题描述 递归解法 运行结果 手工解法 非递归解法 运行结果 递归中的栈

  • leetcode2-Add Two Numbers

    问题: 解法:

  • 抛问题

    “情话可以经常对爱人说吗?” “其实是可以适可而止的。有些情话,可以采用不同的方式方法进行表述;有些情话可以真情流...

  • 约瑟夫问题

    约瑟夫问题 一、数组解法 二、循环队列 三、数学解法

  • 【圆锥曲线】圆

    一、切线方程 问题 解法一 解法二 y_0)=0\&下面化简同解法一\end{align}$$

  • 问题的不同解法

    解决问题讲究策略。 解决问题可以从表面上简单处理,也可以由表及里深层寻找、分析问题发生的根源,从本质上去解决。跟辅...

  • 46. 全排列

    全排列问题有很多的解法 这里使用的解法是位向量法

  • 爬楼梯

    这道题有很多中解法,主要是动态规划解法和基于斐波那契数列解法。 跳台阶问题(剑指Offer) 题目: 解法一 解题...

网友评论

    本文标题:抛瓶子问题的解法

    本文链接:https://www.haomeiwen.com/subject/edkxkqtx.html