2个鸡蛋,n层楼
在日常生活中,我们或许会遇到这样一个有趣的问题:假设你有 2 个鸡蛋和一栋 n 层的高楼,你需要通过从不同楼层扔鸡蛋的方式,找出鸡蛋恰好不会摔碎的最高楼层,也就是所谓的 “临界点”(设为 h)。
问题核心
这里的 “临界点” h,就是鸡蛋扔下去刚好不碎的最高楼层。比如从 9 楼扔没事,10 楼扔就碎了,那 h 就是 9。如果 1 楼就碎,那 h 就是 0;要是 100 层都没事,h 就在 100以上。咱们的目标很明确:不管 h 藏在哪个楼层,都能用最少的尝试次数把它找出来。
方法一:最笨方法(1个鸡蛋的冒险)
方法原理:用一个鸡蛋从第一层开始一层一层扔,若在x层碎了,说明h=x-1; 20层摔碎则零界点h是19层。
优点:简单,容易想到。
缺点:只使用一个鸡蛋,而且最坏情况需要n次,平均需要n/2次,效率极低。
方法二:二分法(看似高效,实则踩坑)
方法原理:第一个鸡蛋在楼层的中间位置进行尝试,确定大致范围后,第二个逐层遍历。
例:第一个鸡蛋在n/2层扔:
如果碎了那第二个鸡蛋就从第一层开始逐层扔到n/2-1层(最坏 n/2 次);
如果没碎就在n/2+(n/2)/2层(即3n/4层)扔,也就是在剩下的楼层对半扔:
若碎了,需从 (n/2)+1 — (3n/4)-1 层逐层试(最坏 2+(n/4-1)次)。
如果没碎,以此类推。
优点:鸡蛋没碎的时候,一下子能排除一半楼层。理论上在鸡蛋数量充足时(如 3 个及以上)效率极高。逻辑简单,符合 二分查找 的直觉思维,容易理解和操作。
缺点:最坏情况次数过高(如第一次在 50 层碎了,需 50 次)。因为鸡蛋数量少(只有 2 个),一旦第一个鸡蛋在早期楼层碎了,剩下的那个鸡蛋就得一层一层慢慢试,次数反而爆表。说白了,这方法适合鸡蛋多的情况,比如 3 个以上,硬套在 2 个鸡蛋的场景里,纯属水土不服。
方法三:固定间隔法(均衡尝试次数)
方法原理:用第一个鸡蛋按固定间隔k层尝试(k可以为n/10,n/5等等),确定大致范围后,用第二个鸡蛋逐层试。
例:k = n/10
第一个鸡蛋尝试 n/10、2n/10、3n/10 ...、n 层(最多 10 次);
若在第n/10*i层碎了,第二个鸡蛋从n/10*(i-1)+1到n/10*i-1层尝试(最多 n/10-1 次);
最坏情况:(n/10-1)+10 次(如h=n-1时,第一个鸡蛋试到n层碎了,第二个鸡蛋试 9n/10+1—n-1 层)。
优点:相比暴力枚举,至少把次数降下来了。而且间隔能灵活调整,比如 30 层的楼,间隔取 5 的话,最坏 5+4=9 次就能搞定。
缺点: 间隔选择依赖经验,若楼层为100, k 选太小(如 5),第一个鸡蛋需试 20 次,总次数 20+4=24 次;若 k 选太大(如 20),第一个鸡蛋最多试 5 次,但第二个鸡蛋可能需试 19 次,总次数 5+19=24 次,均不如中间值合理,存在选择困难。
方法四:最优间隔法(数学方程推导最优解)
方法原理:让 “第一个鸡蛋的尝试次数” 与 “第二个鸡蛋的剩余次数” 之和恒定,实现总次数最小。
****因为n不好来记算数学方程推导,我们令n=100****
设最坏情况下最多尝试x次,推导如下:
第一次在x层扔:
若碎了,第二个鸡蛋需从 1 层到x-1层试(最多x-1次),总次数1+(x-1)=x;
若没碎,剩余x-1次机会,第二次应在x + (x-1)层扔(覆盖x-1层):
若碎了,第二个鸡蛋从x+1层到x+(x-1)-1层试(最多x-2次),总次数2+(x-2)=x;
以此类推,第i次扔的楼层为x + (x-1) + ... + (x-i+1);
总覆盖楼层数需≥100 :x + (x-1) + ... + 1 ≥ 100(等差数列求和)。
解方程:x*(x+1)/2 ≥ 100,得x=14(14*15/2=105≥100)。
步骤:
第一个鸡蛋尝试 14层 (+13-->) 27层 (+12-->) 39 层 (+11-->) 50层 (+10-->) 60层 (+9-->) 69层 (+8-->) 77层 (+7-->) 84层 (+6-->) 90层 (+5-->) 95层 (+4-->) 99层 (+1-->) 100层。(前面累加 14+13+...+4=99 层,剩余 1 层到 100,因此最后一步加 1)
若在某层碎了,用第二个鸡蛋在区间内逐层试,最坏情况总次数≤14。
优点:这个方法最坏情况下的尝试次数最少,是 2 个鸡蛋 n 层楼场景的理论最优解。
缺点:这方法是真的妙,次数是最少的,但就是得提前算好每次扔的楼层,像 14、27、39 这些数,记起来有点费劲。而且仅限 2 个鸡蛋的情况,多一个鸡蛋都用不了,还得靠动态规划那套办法。
从暴力的逐层试,到用数学算出来的最优解,其实就是个不断平衡 “鸡蛋数量” 和 “最坏情况” 的过程。笨办法不顾效率,中间的方法想找平衡,最优解则用逻辑把次数压到了最低。实际碰到这种问题,还是得看手里有几个鸡蛋、楼层多高,再选合适的办法 —— 毕竟解决问题的思路,往往比答案本身更有意思。
//如有问题希望大家指出,谢谢
4万+

被折叠的 条评论
为什么被折叠?



