100层楼摔鸡蛋问题

来源:互联网 发布:表情训练的软件 编辑:程序博客网 时间:2024/04/28 06:19

转自:

http://blog.csdn.net/niteip/article/details/12789027

昨天晚上的笔试题(多益网络),题目描述:

某某有2个硬度相同的鸡蛋,所谓硬度,指鸡蛋从m楼摔下不碎,从m+1楼就碎,那么m就是此鸡蛋的硬度。现有一个100层的楼房,鸡蛋碎了就不能再用,请问最坏情况下,最少要实验几次才能测试出鸡蛋的硬度?

那么我们很容易想到,第一个鸡蛋是测试硬度大致在哪个区间的。分治的思想在ACM中一直陪伴着我们,二分不行,就多点。

为了方便,以100的因子做考虑目标,5层一段、10层一段,20层一段。


比如20层一段,划分为20、40、60、80、100 我们肯定从低层往上实验, 那么最坏情况是什么?是到100层才碎吗,肯定不是,因为80层还没碎,那么我们根本不用实验100层!既然这样,我们直接实验90层,这时才实验了5次,就算第一个鸡蛋碎了,第二个鸡蛋在80-90中挨个测试,也只要不超过10次。所以最坏情况是第一个鸡蛋碎在80层,从60到80最坏19次(总19+5),所以是不行的。同理测试5层一段,可知效率没有10层一段高,于是我得出了答案:10层一段,最坏情况17次。


好看答案吧,还可以优化!


上述方法的效率不稳定,运气好点可能14次,坏点就17次了。就像同等周长,正方形面积比长方形大,我们可以平均一下,前面的区间较大,越后面越小,像这样,假设第2个楼层和下一次试探的楼层之间有x个楼层,即第2次试探的楼层号是A(2)=x+3,以后试探的楼层间隔分别减少1,那么我们第3次试探的楼层号为A(3)=2x+3,第4次为A(4)=3x+2,第5次为A(5)=4x,第n次为A(n)=(n-1)*x-(1/2)*n*n+(5/2)*n,这里需要注意,我们试探的n不能超过x+1,可以这么想来:跳跃测试的n不应超过第一次最大的跨度(也即第一种需要连续测试的区间大小),即n<=x+1。

那么把x替换为n-1,得到A(n)=(1/2)*n*(n+1)+1。楼层为100,那么A(n)=(1/2)*n*(n+1)+1>=100,得到n(n+1)>=198,得n=14,x=13,那么A(n)=(31*n-n*n-26)/2. 即通过楼层2,16,29,41,52,62,71,79,86,92,97,101,(104,106).作为间隔就可以在使用2个鸡蛋,不超过14次测试的情况下找到临界楼层。


该优化方法我并没想到,或许我就普通人的水准吧,不过我在卷子上写的答案,考官估计认为我逻辑就有问题。。。于是果断现在都没接到面试电话。。。。


0 0