题目如下:
你在一座100层的高楼大厦里工作,拿到了两个一模一样的鸡蛋,你得搞明白鸡蛋最高可以从
几层楼扔出去还不摔坏。
请提出一个算法,能找到投掷鸡蛋却保证不摔坏的最少次数
我们可以先做些假设:
1.如果鸡蛋从某一楼层跌落而不摔坏,那么当它从更低楼层跌落也不会
有破损。
2.一个在被投掷之后完好无损的蛋可以被再利用。
3.一颗鸡蛋如果破损,则必会被丢弃。
4.跌落对于所有鸡蛋都具有同等效应
5.如果一颗鸡蛋从某一楼层跌落之后受损,那么当它从更高楼层跌落后
必会摔坏。
6.如果一颗鸡蛋从一次跌落中存活下来,那么它一定会从更短程的降落
中存活。
大多数人会写出算法来解决这个谜题,然而实际上有更容易的办法。
最简单的回答:
最简单的方式来获取最少楼层就是将鸡蛋从第一层扔出,然后第二层,
然后依次往后叠加,这样一来,当鸡蛋破碎那一刻我们就知道是这一层了。
这是一个可靠的算法,但是在最差的情况下它需要的投掷次数是100次。
需要注意的最重要的一点是,假如你只有一颗鸡蛋,这是唯一可靠的
方法,所以在你打破第一颗鸡蛋时就需要开始运用这个算法。
直觉性的答案
这样,我们应该把这100层划分成更小数目的区间,以尽可能有效的
应用这第一颗鸡蛋。因此,一个凭直觉的而且颇受欢迎的方法是
从1/第n层逐层检查。
比方说,从第一层到第三层。由此得出算法如下:
1.从33楼投掷出这颗鸡蛋,如果它破损了,那么我们用第二颗鸡蛋
检查第32层楼。
2.否则,我们从33+(67*1/3)=55层楼扔,如果鸡蛋破损,我们再
来用第二颗鸡蛋检查34层到55层。
对于1/3最坏的情况是最大值是33层,这样一来,我们可能可以找到
一个完美的n,借助一些动态编程手段,来优化投掷次数,这是一个
体现编程思想的有价值的解决方法,然而,这不是最优解。
完美解决方案:
为了理解完美解法,我们需要理解均衡状态,用于计算出在最坏情境下
所需的投掷次数。
~
浙公网安备 33010602011771号