注:问题的解决感谢广东技术师范学院林智勇老师的指导
(一)问题描述
给定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的区块均匀划分对大数不利。