高层扔鸡蛋问题 - 算法及其优化

本文通过分析不同场景下的鸡蛋抛掷问题,探讨如何在有限的鸡蛋数量下,找到导致鸡蛋破裂的临界楼层。从2个鸡蛋、100层楼的基本问题出发,逐步升级到2个鸡蛋的任意楼层问题,再到多个鸡蛋的情况,解析最优策略并提供算法分析,揭示动态规划在解决此类问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本问题:2个鸡蛋,100层楼

先看生活版的问题

问题描述

一栋高楼共有100层,鸡蛋从某个楼层(和此楼层以上高度)掉下来恰好会碎。现在小明手中有2个鸡蛋,他需要怎样才能尽快找出这个临界的楼层?(即在最坏情况下小明需要最少需要多少次才能找到答案)

问题分析

假如小明手中只有一个鸡蛋,那么方法必然只能是从第1层一层一层往上实验,直到临界楼层。最坏情况:100层是临界楼层,那么小明一共要尝试100次才能得到答案。

大家可能会想到用二分法来解决,那么我们第一个鸡蛋在100/2=50层的位置扔下。假如碎了,那么第二个鸡蛋必须只能从第1层一直试到49层,在最坏情况下(答案为49层时),小明共要尝试50次才能得到答案;假如没碎,那么可以用第一个鸡蛋接着在第75层尝试,循环往复直到试出答案。于是可知,用二分法,最坏情况为50次。

那么用三分法呢?第一个鸡蛋扔在33层,最坏情况是(答案为32层时),小明需要1+32=33次才能得到答案。如果是分成10份呢?第一个鸡蛋扔在10层,然后20层…知道100层,最坏情况(答案为99层时),小明共需要扔10(第一个鸡蛋)+9(第二个鸡蛋)=19次

当然也不是分的越细越好,比如说先分成100/5=20份的话。第一次在5层扔,第二次在10层扔,…,一直扔到95层还没碎,那么就已经试了19次了。

那么小明到底应该怎样扔呢?

数学解释

假设在最坏情况下,小明需要扔 x 次才可以测出临界楼层。小明首先在第 i 层扔出了鸡蛋,有两种情况:

  • 鸡蛋碎了,那么小明的第二个鸡蛋只能从第1层一层层往上直到 i-1层 来测试,于是小明共尝试 1+i-1 = i 次,即 i=x
  • 鸡蛋没碎,那么小明还剩下x-1次测试机会,于是第二次尝试楼层只能高出第i层 x-2 层(包括第二次尝试楼层)。

同理继续往下,可知若第二次没碎,第三次的楼层只能高出第二次楼层 x-3 层。于是得到方程:
x + ( x − 1 ) + ( x − 2 ) + . . . + 1 ≥ 100 x+(x-1)+(x-2)+...+1 \geq 100 x+(x1)+(x2)+...+1100
解得 x=14 ,即小明第一次在14层扔,若没碎,则在27层扔…。若一直都没碎,小明扔的楼层序列为:14,27,39,50,60,69,77,84,90,95,99,100。在最坏情况下(答案为13层时),小明共需尝试14次。

问题升级:2个鸡蛋,n层楼

问题描述

楼层从100层变为"虚无缥缈"的n层楼,小明还是拥有两个鸡蛋,问小明最少需要多少次才可以测得临界楼层。

算法分析

f(n) 为n层的楼栋所需的最少尝试次数才能在最坏情况下测出鸡蛋破碎的临界楼层。

按照之前生活版问题,首先小明将第一个鸡蛋从第 i 层扔下去:

  • 碎了,则小明第二个鸡蛋还需操作 i-1 次才能获知答案
  • 没碎,则还剩下 n-i 个楼层待测试,并且小明还是有两个鸡蛋,于是问题退化为f(n-i)

于是,在最坏情况下,小明在从第 i 层扔完第1个鸡蛋后还需要尝试max{i-1, f(n-i)}次。加上扔的这一次,即1+max{i-1, f(n-i)}。于是有:
f ( n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值