一道关于扔球/扔鸡蛋/摔手机的DP问题(蓝桥杯题目/面试题)

注:问题的解决感谢广东技术师范学院林智勇老师的指导

(一)问题描述

给定N层楼和i个球。用i个球检测在这N层楼中的某一层t球扔下楼时不碎,而在t+1层球扔下楼时会碎,则t层称为最高安全层。求用i个球一定可以检测N层楼的最高安全层的最少扔球次数。(注:球不碎还可以再用)

Example:

给定i=3个球,检测N=7层楼,最优的情况如下:


由上图可得最少的扔球次数为3。

(二)问题求解思路

下面给定两个思路:

(一)分块思想:举个例子,i=2,N=100

现在设想着你手头只有一个球,那么很显然,你只能从最底层(即第一层)一层一层地往上试,那么考虑最坏情况(即最高安全层在第100层),最大的扔球次数就是100,可见在整个过程中我们只能逐层的尝试,否则在任何一层上球碎了,我们就不能准确的确定最高安全楼层了。(一个球的尝试方法是暴力而且简单的,但对于两个球的情况会有所启示)

我们现在考虑有两个球的情况下,那么我们可以尝试用第一个球来确定一个较小的范围,而第二个球则在这个范围内逐层去尝试(由只一个球的尝试方法得到的启示)。

这时我们很容易的想到将100分成10个10层,第一个球用来确认在哪个10层里,第二个球用来确认具体层数。具体来说就是,拿着第一个球从第10层尝试,只要没碎就再上10层,直至碎了或者爬到楼顶,这样确定了十位数的范围。然后再用第二个球逐层尝试。如第一个球:在第10层扔下没碎,那就在第20层,扔下还是没碎,那就在第30层,扔下还是没碎,继续往上10层,假设在第40层扔下碎了;那么就拿第二个球从31层至39层开始依次逐层尝试,直至排查出最高安全楼层为止。大致思路如下:


这种思法已经比较接近答案了,但你会发现还有问题。比如如果球最高安全楼层为16或者96,用刚刚那个想法的话,这两种情况的总尝试次数并不一样:最高安全楼层为16时,第一个球试了2次就定位了区块;而最高安全楼层为96时,第一个球试了10次才定位了区块。虽然在区块内部的第二个球的逐层尝试是一样的,但96层对应的总尝试次数就多得太多了。原因就是10*10的区块均匀划分对大数不利。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值