[百度面试题]100层楼,球可能会在某一层楼摔坏,问用2个球,最坏情况下几次测试可以找出该楼层

这篇博客探讨了一道关于寻找100层楼中摔坏球的楼层的问题,如何用2个球在最坏情况下找出摔坏楼层。通过动态规划方法,得出在最坏情况下,2个球需要14次测试,3个球需要9次测试,并展示了具体的测试过程。
摘要由CSDN通过智能技术生成

该题还可以扩展,比如说给更多的球,如3个球,多少次测试可以找出楼层。

分析如下:

用动态规划解这个问题

设f(a, b)为a个球做b次测试可以测试到的楼层数,可以确定的楼层数即为f(a, b) + 1,因为第1层不需测试,需要测试的楼层号仅仅为[2, f(a, b) + 1]共f(a, b)层,也就是a个球b次测试可以测试到的楼层数。考虑第1次测试,测试的楼层记为x:

1)如果球破了,就需要测试x下面的楼层,还剩下a-1个球b-1次测试,测试的楼层数为f(a - 1, b - 1)。

2)如果球没有破,那么需要测试x上面的楼层,还剩下a个球b-1次测试,测试的楼层数为f(a, b - 1)。

a个球b次测试为1)2)测试的楼层数及第1次测试了的1层,所以:

f(a, b) = f(a - 1, b - 1) + f(a, b - 1) + 1                                              (1)

考虑初始条件,显然f(a, 1) = 1(a >= 1,1次测试可以测试到的楼层数当然为1,不论多少个球),f(1, b) = b(b >= 1,1个球做了b次测试当然测试到了b层楼)。

 

强调一下:注意f(a, b)为测试到的楼层数,f(a, b)加上不需测试的楼层才是可以确定的楼层(f(a, b) + 1)。

动态规划解(1)式即可。

一般来说,a >= 2(1个球意义不大),可以计算出f(2, 64) = 2080,f(3, 64) = 43744,f(4, 64) = 679120。

程序如下

 

[cpp] view plain copy

  1. /* 
  2.  * a balls, n floors, want to find the minimum number of floor 
  3.  * where a ball drops will be broken. output the minimum number 
  4.  * of drops 
  5.  * METHOD: dynamic programming 
  6.  * assum the answer is b, that is the number of drops 
  7.  * f(a, b): the maximum number of floors, when a balls and b drops 
  8.  * f(a, b) = 1 + f(a, b - 1) + f(a - 1, b - 1) 
  9.  * obviously, f(a, 1) = 1; f(1, b) = b 
  10.  */  
  11. #include <stdio.h>  
  12. #include <stdlib.h>  
  13. #incl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值