假设有n层楼,2个鸡蛋。问最少摔几次能够找出恰好把鸡蛋摔坏的楼层。
这是一个典型的 min(max) 问题。
解题思路
动态规划
第一种思路是,动态规划,这里状态有两个维度:可用鸡蛋个数,待检验楼层个数。
假设第一次从i层开始摔,如果碎了,还剩一个鸡蛋,只能从一层开始遍历,最坏需要i次;如果没碎,问题转化成n-i个层楼,2个鸡蛋,总次数是 f(n-i,2)+1。
直观解法,以及二分查找优化,可以参见这篇文章:
https://zhuanlan.zhihu.com/p/92288604
边界值
另一种思考方式,直接构造最佳方案:
如果第一次在第x层摔碎了,我们最多必然要用x次尝试;如果没碎,我们就从第 x+(x-1) 层开始摔,还不碎就从 x+(x-1)+(x-2) 层开始摔 ……,为什么?
为了让每种情况下摔的最差次数相同。第一个鸡蛋一下就摔碎,我们查找用x次;第二下摔碎,还是用了x次,第三次才碎还是x次……,最后发现从x层开始摔,可以检验出的楼层个数是 x(x+1)/2 。而恰好,1415/2 > 100,所以能14次就够,并且方案也有了,就从14层开始摔,然后是27层……