题目:

现有两个硬度相同的鸡蛋,以及一栋100层的楼,如果鸡蛋在第n层楼摔下去不会碎,在n-1层楼摔下去会碎,那么鸡蛋的硬度是n,如果要测出鸡蛋的硬度n,在最坏情况下最少要测试几次?每测试一次就把一个鸡蛋从x层楼扔下去;只有两个鸡蛋可用,鸡蛋摔碎了就不能用了;

题目分析:

1:二分????

刚开始看到这个题脑子里最先蹦出来的就是二分;每次取一半,log(n)的算法,然后稍微深入分析一下就悲剧了;

按照二分思路,第一个鸡蛋在50层扔下,没有碎;75层,还没碎;88层,仍然坚强不碎;94层,还是一如既往的坚固;97层,还不碎????!!!;99层,,,,,,100层;7次就测出来了;你这么能咋不直接从100层扔鸡蛋?直接不碎,1次就测出来了。。。

注意题目要求最坏情况;什么是最坏情况?第一个鸡蛋50层就碎了,还剩一个鸡蛋,此时你只能乖乖的从第1层开始测试,不然的话,50层之后直接到25层,第二个鸡蛋也碎了就测不出鸡蛋的强度了;

所以二分在最坏情况下需要测50次:第一个鸡蛋在50层碎了,第二个鸡蛋从第一层测试到49层:1+49=50;

2:分段????

第一次测x层,没破测2*x层,依次递推,如果在i*x层破了,就从(i-1)*x+1层开始一直测到i*x层,

经过计算发现最优的x是8, 9, 10, 11, 12, 13,此时需要测k=19次(100/x+(x-1));

这个好像比较靠谱,19次就能测出来,比二分靠谱多了;难道就没有更好的方法了吗????

3:递推!!!

如果第一次扔鸡蛋,鸡蛋就碎了,那么第二个鸡蛋一定是从1层向上测试,此时如果第一次在第k层楼扔鸡蛋,鸡蛋卒,最坏情况下还需测k-1次,共计k次;现在我们假设最少就需要k次能测出鸡蛋硬度,第一次扔鸡蛋,鸡蛋卒的情况下最优解是k,若第一次鸡蛋生,第二次扔鸡蛋鸡蛋卒最优解也要是k的话,第二次一定在第k+k-1=2*k-1层楼扔鸡蛋,因为在第二次扔鸡蛋,鸡蛋卒后,就需要由第k+1层测试到第2*k-2层,测试了k-2次,共计1+1+k-2=k次;同理,如果第二次扔鸡蛋,鸡蛋未卒,第三次扔鸡蛋,鸡蛋卒,则第三次在第k+(k-1)+(k-2)层扔鸡蛋。。。依次递推当前k-1次鸡蛋都逃出生天,到第k次扔鸡蛋时已经该测试第k+(k-1)+(k-2)+(k-3)+···+1=(k+1)*k/2层楼了,也就是说,此楼最多(k+1)*k/2层才能通过最少k次测出鸡蛋硬度;

综上所述:当(k+1)*k/2>=n时,一定可以用k次测出在n层楼上鸡蛋的强度;

对于一个给定的n,取最小的k满足上式,k就是最优解;

当n=100时,k=14时最优;

4:动态规划!!!!

是不是很惊讶???!!!这样也能DP!!!

若n为楼层总数, 令f[n]为总共n层楼时的最优解;在第i层楼如果鸡蛋碎了, f[i]=i-1+1(从第一层开始测试);如果鸡蛋未碎, f[i]=f[n-i]+1(在剩下的n-i层楼测试最优解);所以:f[i]=max(i-1, f[n-i])+1;

f[n]=min(max(i-1, f[n-i])+1  |  i=1, 2, 3, 4, ···, n);

#include<bits/stdc++.h>
using namespace std;
int main(){int f[105];f[0]=0;for(int i=1; i<=100; i++){f[i]=i;for(int j=1; j<=i; j++){f[i]=min(f[i], max(j-1, f[i-j])+1);}}   cout << f[100] << endl;return 0;
}

将该题扩展一下, n层楼,m个鸡蛋如何推出最优解?

还是用DP做一下:f[n][m]表示n层楼m个鸡蛋时的最优解;

在第i层,有j个鸡蛋时,本次测试鸡蛋卒,f[i][j]=f[i-1][j-1]+1(用剩下的j-1个鸡蛋测试i-1层),鸡蛋生还f[i][j]=f[n-i][j]+1(继续用j个鸡蛋测试剩下的n-i层);f[i][j]=max(f[i-1][j-1], f[n-i][j])+1;

所以f[n][m]=min(max(f[i-1][j-1], f[n-i][j])+1  |   i=1, 2, 3, 4, ···, n)

#include<bits/stdc++.h>
using namespace std;
int main(){int f[105][105];for(int i=0; i<=100; i++){f[i][1]=i;}for(int j=2; j<=100; j++)for(int i=1; i<=100; i++){f[i][j]=i;for(int k=1; k<=i; k++){f[i][j]=min(f[i][j], max(f[k-1][j-1], f[i-k][j])+1);}} cout << f[100][2] << endl;return 0;
}

2个鸡蛋,100层楼问题;相关推荐

  1. 你还在用二分法求2个鸡蛋100层楼的问题吗?

    题目 2个鸡蛋,100层楼,如何用最少的试验次数得到在鸡蛋落下不碎的最高层数?这一据说曾被谷歌纳入校园招聘题库的经典面试题,想必许多人都曾遇到过,又有多少人与我一样,不加思索就直接回答用二分法查找的? ...

  2. 2个鸡蛋100层楼/2个玻璃珠39层楼

    题目描述: 你拿着两个鸡蛋站在100层的大楼上.鸡蛋或许结实到从楼定掉下也不会摔碎,或许很易碎.最少试验多少次可以找出鸡蛋被摔碎的最低楼层? 腾讯2017笔试题也有类似的题目,描述是针对2个玻璃珠和3 ...

  3. 2个鸡蛋100层楼--动态规划

    原题:两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事.有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置.可以摔碎两个鸡蛋.在最坏的情况下最 ...

  4. 两个鸡蛋100层楼(DP)

    #include <iostream> using namespace std;#define N 500 #define max(a,b) (a>b?a:b) #define mi ...

  5. 面试题目:2个鸡蛋100层楼问题

    一道非常经典的面试题目,给你两个鸡蛋,在一幢100层的大楼里面,至少扔几次可以测出让鸡蛋破碎的临界高度? 最朴素的做法是从100层一直扔到1层,不过这样明显不是最优的.这题目其实可以转化为dp求解,假 ...

  6. 100层楼,2个鸡蛋问题

    题目描述: 一道非常经典的面试题目,给你两个鸡蛋,在一幢100层的大楼里面,至少扔几次可以测出让鸡蛋破碎的临界高度? 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事 ...

  7. 关于100层楼,扔两个鸡蛋,求摔碎鸡蛋的临界层的问题

    题目描述: 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事.有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置.可以摔碎两个鸡蛋. 网上有人 ...

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

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

  9. 100层楼,最少需要几次测试,才能得到摔碎鸡蛋的楼层

    我在腾讯二面碰到了这个问题. 转自:https://blog.csdn.net/Madoka_Homura/article/details/78331152 对于这个问题,如果从编程角度而言,最简单的 ...

  10. 动态规划--100层楼2只鸡蛋最少次可以测试最高楼层不摔破

    100层楼2个鸡蛋 原题目:100层楼2个鸡蛋最少需要几次测试,才能得到摔破鸡蛋的楼层: 转换题目:两个鸡蛋,进行k次测试,最多可以测试多少层? 分析:第1个鸡蛋测试所在的楼层高度为k层. ①如果第1 ...

最新文章

  1. 7.12 其他面向对象设计原则3: 依赖倒置原则DIP
  2. slurm用户快速入门手册
  3. git 基本操作语句
  4. Android多个imei如何获取,如何在Android 10中获取IMEI号,这是获取在Android 10及以下Android 10中获取IMEI号的代码...
  5. dnse 2.0音效厉害还是full sound厉害点呢?谢谢!!
  6. C#学习之ObjectOriented、Record
  7. [leetcode] Palindrome Number 回文数判断
  8. 路由器截获微信消息_猫(Modem)和路由器有什么区别?
  9. Centos7 下安装tomcat7
  10. backupexec Oracle授权,通过BackupExec重定向Oracle 8I数据库
  11. 玩转C语言Socket网络编程
  12. linux多人共享桌面,gnome 开远程桌面共享功能(linux启动多个桌面)
  13. Maven打包时指定配置文件
  14. oracle yyyymmdd 年末,oracle中日期格式'yyyy-mm-dd'和'yyyymmdd'的区别
  15. 高拍仪、浏览器获取获取多摄像头,切换摄像头
  16. 如何建立个人网站服务器篇
  17. python绘制笛卡尔直角坐标系
  18. java实现OCR图文识别Tess4j,高准确率高效率
  19. 单边指数信号的傅立叶matlab,实验四连续信号的傅立叶变换
  20. python 回车键_python tkinter 绑定回车键

热门文章

  1. C++STL之初识容器和迭代器
  2. 教你文本聚类(参考http://www.kuqin.com/searchengine/20080511/8323.html)
  3. 单元测试(01) 调试过程中遇到 Method isEmpty in android.text.TextUtils not mocked
  4. 推荐9款最佳的编程字体
  5. 为什么我们不能坚持到底?
  6. 机器学习任务的一般流程及必要步骤
  7. Halcon如何创建或生成空白的,全黑或全白的8位图和24位图
  8. linux 脚本 等待,在shell脚本中实现无限等待
  9. 5月Github上最热门的数据科学和机器学习项目TOP5
  10. html2d动画,HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用