惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Martin Fowler
Martin Fowler
B
Blog RSS Feed
D
DataBreaches.Net
L
LangChain Blog
月光博客
月光博客
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
美团技术团队
Jina AI
Jina AI
博客园 - 司徒正美
雷峰网
雷峰网
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
小众软件
小众软件
罗磊的独立博客
博客园_首页
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
A
About on SuperTechFans
Engineering at Meta
Engineering at Meta

博客园 - 云编程的梦

OpenGL超级宝典笔记5 C++读写XML文件(libxml2库) libxml2对XML文件的创建、解析、查找、修改 [置顶] 我的设计模式学习笔记------>单例模式(Singleton) libxml2.7.8 c++ 解析xml文件 Head First设计模式-模板方法模式 嵌入式开发之工具移植--openssl移植 嵌入式开发之工具移植--wpa_suppliant工具的移植和使用 linux下嵌入式wifi开发工具移植 IOS面试题(英文) java提高篇-----理解java的三大特性之继承 staruml使用教程 黑马程序员:HTML习题1 Cocos2d-x-->CCSprite 动画 地址栏传参中文乱码详解 Qt学习第二天 Lync 2010 升级到2013 之部署2013前端服务器! Lync 2010升级到Lync 2013之更新CU2! eCos启动过程详解,基于Cortex-M架构
100层楼摔鸡蛋问题
云编程的梦 · 2013-10-17 · via 博客园 - 云编程的梦

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

某某有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)