x*(x+1)/2=100层楼,x为最优解

 第二天

题目:扔鸡蛋问题

有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度。比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层。

问:如何用最少的尝试次数,测试出鸡蛋不会摔碎的临界点?

举个栗子,最笨的测试方法,是什么样的呢?把其中一个鸡蛋,从第1层开始往下扔。如果在第1层没碎,换到第2层扔;如果在第2层没碎,换到第3层扔.......如果第59层没碎,换到第60层扔;如果第60层碎了,说明不会摔碎的临界点是第59层。

在最坏情况下,这个方法需要扔100次。

方法一:二分法

采用类似于二分查找的方法,把鸡蛋从一半楼层(50层)往下扔。

如果第一枚鸡蛋,在50层碎了,第二枚鸡蛋,就从第1层开始扔,一层一层增长,一直扔到第49层。

如果第一枚鸡蛋在50层没碎了,则继续使用二分法,在剩余楼层的一半(75层)往下扔......

这个方法在最坏情况下,需要尝试50次。

方法二:平方根法

如何让第一枚鸡蛋和第二枚鸡蛋的尝试次数,尽可能均衡呢?

很简单,做一个平方根运算,100的平方根是10。

因此,我们尝试每10层扔一次,第一次从10层扔,第二次从20层扔,第三次从30层......一直扔到100层。

这样的最好情况是在第10层碎掉,尝试次数为 1 + 9 = 10次。

最坏的情况是在第100层碎掉,尝试次数为 10 + 9 = 19次。

不过,这里有一个小小的优化点,我们可以从15层开始扔,接下来从25层、35层扔......一直到95层。

这样最坏情况是在第95层碎掉,尝试次数为 9 + 9 = 18次。

假设最优的尝试次数的x次,为什么第一次扔就要选择第x层呢?

这里的解释会有些烧脑,请小伙伴们坐稳扶好:

假设第一次扔在第x+1层:

如果第一个鸡蛋碎了,那么第二个鸡蛋只能从第1层开始一层一层扔,一直扔到第x层。

这样一来,我们总共尝试了x+1次,和假设尝试x次相悖。由此可见,第一次扔的楼层必须小于x+1层。

假设第一次扔在第x-1层:

如果第一个鸡蛋碎了,那么第二个鸡蛋只能从第1层开始一层一层扔,一直扔到第x-2层。

这样一来,我们总共尝试了x-2+1 = x-1次,虽然没有超出假设次数,但似乎有些过于保守。

假设第一次扔在第x层:

如果第一个鸡蛋碎了,那么第二个鸡蛋只能从第1层开始一层一层扔,一直扔到第x-1层。

这样一来,我们总共尝试了x-1+1 = x次,刚刚好没有超出假设次数。

因此,要想尽量楼层跨度大一些,又要保证不超过假设的尝试次数x,那么第一次扔鸡蛋的最优选择就是第x层。

方法三:解方程法

x + (x-1) + (x-2) + ... + 1 = 100

这个方程式不难理解:

左边的多项式是各次扔鸡蛋的楼层跨度之和。由于假设尝试x次,所以这个多项式共有x项。

右边是总的楼层数100。

下面我们来解这个方程:

x + (x-1) + (x-2) + ... + 1 = 100  转化为

(x+1)*x/2 = 100

最终x向上取整,得到 x = 14

因此,最优解在最坏情况的尝试次数是14次,第一次扔鸡蛋的楼层也是14层。

最后,让我们把第一个鸡蛋没碎的情况下,所尝试的楼层数完整列举出来:

14,27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100

举个栗子验证下:

假如鸡蛋不会碎的临界点是65层,那么第一个鸡蛋扔出的楼层是14,27,50,60,69。这时候啪的一声碎了。

第二个鸡蛋继续,从61层开始,61,62,63,64,65,66,啪的一声碎了。

因此得到不会碎的临界点65层,总尝试次数是 6 + 6 = 12 < 14 。

转载于:https://my.oschina.net/hejunbinlan/blog/2980286

100层楼扔鸡蛋,最快速度找出,哪层是鸡蛋碎的临界点相关推荐

  1. 100层楼扔2个鸡蛋、3个鸡蛋……

    原题目 现有2个鸡蛋,楼高100层,假设从n层楼及以上扔下会摔碎,n层以下不会,那么怎样扔能以最小的次数得到n? 分析 最先想起来的是二分法的题目:100层最少需要扔多少次鸡蛋才能求得n?答案是cei ...

  2. 程序员智力题:100层楼扔鸡蛋,确定鸡蛋摔碎的楼层N

    程序员笔试智力题:建筑楼有100层,若曾第N层或更高的楼层扔下来,鸡蛋就会摔碎.若从第N层以下的楼层扔下鸡蛋不会摔碎.给你两个鸡蛋,请找出N,并要求最差情况下扔鸡蛋次数最少. 分析:试着从10楼开始扔 ...

  3. 100层楼扔鸡蛋或者玻璃珠问题

    ---------------------------以下网上别人的解答---------------------------------------------- 有一栋楼共100层,一个鸡蛋从第N ...

  4. Python经典编程习题100例:第78例:找出年龄最大的人

    不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程10 ...

  5. 100层楼,2个鸡蛋,找出那一层鸡蛋破

    解析: 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破.给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数. 我们先假设最坏情况 ...

  6. 100层楼2个鸡蛋,如何得知鸡蛋能承受几层的撞击

    有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破.给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数. 我们先假设最坏情况下,鸡蛋 ...

  7. 100层楼2个鸡蛋,测试其最低破碎楼层问题

    原文章链接 http://www.cnblogs.com/yangai/p/5391533.html http://www.tuicool.com/articles/NzUNJr http://blo ...

  8. 100层楼摔鸡蛋问题

    题目]有一栋100层高楼,从某一层开始扔下的玻璃杯刚好摔坏,现有两个玻璃杯,最少几次能找到那一层? reference http://my.oschina.net/kaixindewo/blog/16 ...

  9. 两个玻璃球和100层楼的问题

    (http://hi.baidu.com/ajdo/blog/item/f0c292ed8cf6b05d78f055ba.html) 给你两个玻璃球,有一座100层的大厦,用最少的实验次数找出临界层, ...

  10. 100层楼,2个玻璃杯

    [题目]有一栋100层高楼,已知存在一个特殊的楼层,低于这层,摔玻璃杯不会碎:从这一层起往上,摔玻璃杯一定会碎.现在有两个玻璃杯,请设计一种策略,确保一定能在N次内找到这个特殊楼层,并且尽量让N最小. ...

最新文章

  1. 关于ProGuard的学习了解(从别处转来)
  2. 深入剖析防火墙策略的执行过程
  3. Dynamic Setting ImageUrl In DataPager
  4. [Java]list集合为空或为null的区别
  5. php动物书总结01-06
  6. jQuery 一次定时器_年薪百万之路--第五十一天 jQuery(上)
  7. linux+卸载+gpm服务,Linux gpm下console中使用鼠标
  8. [NewLife.XCode]百亿级性能
  9. 线程的3种实现方式并深入源码简单分析实现原理
  10. 网友调侃特斯拉股价要冲向火星 马斯克:疯狂的时代
  11. GCC 11.1 进行 C++ 多项优化
  12. python拼图游戏代码_教你用Python自制拼图小游戏,轻松搞定熊孩子
  13. Android studio java.lang.UnsatisfiedLinkError加载.so文件失败解决办法
  14. 一个简单的Matlab面向对象编程实例
  15. 不要小看了get 与set
  16. PostgreSQL是世界上最好的数据库
  17. 使用print时出错 SyntaxError: Missing parentheses in call to ‘print‘ Did you mean print(““)
  18. 诺基亚 索爱 低端手机及智能手机 与 QQ邮箱或MyTT 通讯录同步 介绍
  19. 可自建中继服务器的远程桌面软件: RustDesk
  20. JAVA中break和continue用法

热门文章

  1. 实时计算交易盈亏、平仓盈亏和浮动盈亏
  2. 停止dockerd进程
  3. [原创]战国的杀人机器白起
  4. 前端装逼必备--Canvas
  5. 基于AM437x的FPGA与ARM通信测试
  6. 单片机蓝桥杯——超声波测距
  7. 安装ipa-server
  8. FreeIPA 4.7.0 服务端 部署
  9. 联想y7000电脑未正确启动_联想y7000wifi突然不能用了是怎么回事
  10. HTML+CSS简单漫画网页设计成品 蜡笔小新3页 大学生个人HTML网页制作作品