zoukankan      html  css  js  c++  java
  • 100层楼摔鸡蛋问题

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

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


    悲剧的我理解错了题意,我想的是用两个鸡蛋摔一次,不管结果如何,就算实验一次,在原有实验基础上,拿另外两个鸡蛋做实验就是次数+1,于是很简单的二分嘛,7次。

    回来一百度。。。。。。悲剧


    该题是只能用2个鸡蛋


    那么我们很容易想到,第一个鸡蛋是测试硬度大致在哪个区间的。分治的思想在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次测试的情况下找到临界楼层。


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



    我勒个去,这篇blog写完没多久,我就接到了多益的面试电话,我去,总之很高兴(SJ  21:39:34)

  • 相关阅读:
    英雄无敌5东方部落秘籍
    Tomcat基础学习
    Flume入门
    SparkStreaming 编程指南
    Kafka单机配置部署
    Kafka介绍 (官方文档翻译)
    spark调优
    《Spark Python API 官方文档中文版》 之 pyspark.sql (四)
    《Spark Python API 官方文档中文版》 之 pyspark.sql (三)
    git基本常用命令总结
  • 原文地址:https://www.cnblogs.com/phisy/p/3373595.html
Copyright © 2011-2022 走看看