扔鸡蛋-面试题

链接:https://mp.weixin.qq.com/s/NugGnNX4Vv3SNhQrmzjF-A

有两个鸡蛋,100层楼,如何准确地测试出哪层鸡蛋会碎?

有类似二分法,和解方程法。

设最少次数为x,则可以证明应该x层扔下。若从x+1层扔下,需要扔x+1次;若从x-1层扔下,则需扔x-1次,略保守;所以最后得出一个等式

x+x-1+x-2+...+1=100.(=层数。

得出最优是在14层,

那么分别是14,27,39.。。。。以此类推。

问题拓展:

如果是在M层楼,有N个苹果,那么如何判断在几层扔刚好会碎?//这个扩展可真是变态,想不出来。

链接:https://www.nowcoder.com/questionTerminal/d8a4a3f52d4943c0864caa7c1eb972a7?source=relative
来源:牛客网

这是典型的动态规划问题。假设f[n]表示从n层楼找到摔鸡蛋不碎安全位置的最少判断次数。假设第一个鸡蛋第一次从第i层扔下,如果碎了,就剩一个鸡蛋,为确定下面楼层中的安全位置,必须从第一层挨着试,还需要i-1次;如果不碎的话,上面还有n-i层,剩下两个鸡蛋,还需要f[n-i]次(子问题,实体n层楼的上n-i层需要的最少判断次数和实体n-i层楼需要的最少判断次数其实是一样的)。因此,最坏情况下还需要判断max(i-1,f[n-i])次。

状态转移方程:f[n] = min{ 1 + max(i - 1 ,f[n - i]) | i = 1 ..n } 
初始条件: f[ 0 ] = 0 (或f[ 1 ] = 1


现在推广成n层楼,m个鸡蛋:
还是动态规划。假设f[n,m]表示n层楼、m个鸡蛋时找到摔鸡蛋不碎的最少判断次数。则一个鸡蛋从第i层扔下,如果碎了,还剩m-1个鸡蛋,为确定下面楼层中的安全位置,还需要f[i-1,m-1]次(子问题);不碎的话,上面还有n-i层,还需要f[n-i,m]次(子问题,实体n层楼的上n-i层需要的最少判断次数和实体n-i层楼需要的最少判断次数其实是一样的)。

状态转移方程:f[n,m] = min{ 1 + max(f[i - 1 ,m - 1 ], f[n - i,m]) | i= 1 ..n }
初始条件:f[i, 0 ] = 0 (或f[i, 1 ] = i),对所有i
 
//那么代码怎么写呢?
 
posted @ 2018-07-09 19:53  lypbendlf  阅读(210)  评论(0编辑  收藏  举报