扔鸡蛋-面试题
链接: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]表示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
//那么代码怎么写呢?