题目如下:

你在一座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,借助一些动态编程手段,来优化投掷次数,这是一个

体现编程思想的有价值的解决方法,然而,这不是最优解。

完美解决方案:

为了理解完美解法,我们需要理解均衡状态,用于计算出在最坏情境下

所需的投掷次数。

 

 

~

 

posted on 2018-02-22 20:55  HE不言  阅读(42)  评论(0)    收藏  举报