题目描述:

你拿着两个鸡蛋站在100层的大楼上。鸡蛋或许结实到从楼定掉下也不会摔碎,或许很易碎。最少试验多少次可以找出鸡蛋被摔碎的最低楼层?

腾讯2017笔试题也有类似的题目,描述是针对2个玻璃珠和39层楼。

题目分析:

假定鸡蛋被摔碎的最低楼层我们称之为临界层。

有两个鸡蛋,第一次测试时,第一个鸡蛋不能放置的楼层太高,否则,如果第一个鸡蛋破碎了,那么第二个鸡蛋就必须在第一层试验的楼层以下,从一楼一层一层地往上试验直到找到临界层;但是也不能放置的太矮,如果第一个鸡蛋破碎了倒是可以缩小下次试验的楼层范围,但如果没破碎,我们便浪费了将这次试验机会的所能缩小的范围最大化。所以必须选择一个合适的楼层作为第一次测试的楼层。

假设总共耗费k次试验机会一定能试验出临界层。

情况一,我们考虑第一次试验,若鸡蛋破碎了,记住此时的楼层数为k';那么我们第二次从一楼开始往上一层一层地试验,最坏的情况是到k'-1层第二个鸡蛋都没碎,但是这时我们总共试验了k'次,还要考虑我们只有k次机会的前提,所以k'=k,也就是说,第一次测试时我们需要从第k层开始试验。

情况二,考虑另一种情况,假如第一次试验的鸡蛋没有破碎,那么我们失去了一次机会,此时需要从k+1层楼往上试验,那么重点来了,我们第二次选第几层开始试验呢?想一想,我们刚才浪费了一次机会,此时剩余k-1次机会,我们还是应该回归到情况一,得出的结论是下一次需要从k+(k-1)层开始试验(因为我们这次是从第k+1层开始算起),如果鸡蛋一直没碎,我们就需要重复上述过程知道最后一次机会,此时总共的测试楼层数为:k+(k-1)+(k-2)+(k-3)+……+2+1 = k*(k+1)/2。

回到题目,100层楼/2个鸡蛋或者39层楼/2个玻璃珠,k次试验找出临界层,试验的楼层数k*(k+1)/2大于等于总的楼层数,根据这个不等式便可以计算出k值。

对于100层楼,总共试验14次;对于39层楼,总共试验9次。

==================分隔线===================

转载自:http://www.cnblogs.com/jostree/p/4098409.html

使用动态规划算法,使用dp[i][j]表示对于i层楼并拥有j个鸡蛋时能够判断鸡蛋质量需要的最少次数。

假如我们在第k层扔下一个鸡蛋,则有两种情况,如果鸡蛋没有损坏则问题相当于我们对于i-k层楼拥有j个鸡蛋所需的最少的次数。

如果鸡蛋碎了,则问题相当于对于k层楼拥有j-1个鸡蛋的最小次数。从而可以得到动态规划公式:

dp[i][j] = Min( Max( dp[k][j-1], dp[i-k][j] ) ) ,  k ∈ [1. i)

数学方法推导:

如果我们有2个鸡蛋,k次投掷机会,那么第一次在k层投掷,如果坏掉,则从第一层往上一层一层的投。

否则剩下k-1次机会,所以要在k+(k-1)层投掷,如此往复,两个鸡蛋可以投掷的最高楼层为:

k+(k-1)+(k-2)+……+1 = k(k+1)/2

对于3个鸡蛋k次机会,根据上面的结论,两个鸡蛋k-1次可以试k(k-1)/2层楼。

所以第一次在k(k-1)/2+1层投,如果坏掉,则按2个鸡蛋共k(k-1)/2的方式投掷。

否则剩下k-1次机会和3个鸡蛋,则在此基础上增加(k-1)(k-2)/2+1层投掷,。

如此往复,三个鸡蛋可以投掷的最高层为:

((k(k-1)/2)+1) + (((k-1)(k-2)/2)+1) + ... ... + 1 = (k^3 + 5k)/6


import java.util.Scanner;public class EggFloor {private static final int FLOORS = 1001;private static final int EGGS = 51;private static int dp[][];public static int resolve(int eggs, int floors) {dp = new int[FLOORS][EGGS];for(int i = 1; i <= floors; i++) {dp[i][1] = i-1;}for(int i = 1; i <= eggs; i++) {dp[1][i] = 0;}for(int i = 2; i <= floors; i++) {for(int j = 2; j <= eggs; j++) {int tmp = Integer.MAX_VALUE;for(int k = 1; k < i; k++) {tmp = Math.min(tmp, Math.max(dp[k][j-1], dp[i-k][j]));}dp[i][j] = tmp + 1;}}return dp[floors][eggs];}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int count = scanner.nextInt();while(count-- != 0) {int cnt, eggs, floors;cnt = scanner.nextInt();eggs = scanner.nextInt();floors = scanner.nextInt();System.out.println(cnt + " " + resolve(eggs, floors));}scanner.close();}}

2个鸡蛋100层楼/2个玻璃珠39层楼相关推荐

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

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

  2. 2个鸡蛋100楼问题

    https://www.cnblogs.com/yangai/p/5391533.html 博客1 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事. 有座100层的 ...

  3. Google面试题:扔玻璃珠Matlab实现

    题目: 某幢大楼有100层.你手里有两颗一模一样的玻璃珠.当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎.这幢大楼有个临界楼层.低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,等于 ...

  4. 2017年完美世界校招笔试题,从n层大楼往下扔m颗玻璃珠确定珠子破碎的临界楼层

    这道题可以搜索google扔玻璃珠笔试题以及腾讯2017的校招笔试也有一道这样的题,不同的是,以上的题中只是用了两颗玻璃珠,而这里是m颗玻璃珠: 不过,同样是扔珠子,所以思路都是一样,只不过变得更有普 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 广西农产品(广州)交易会 农业大健康·林裕豪:签约农商对接
  2. python之torchlight使用_python游戏编程之pgzero使用介绍
  3. jgroups_JGroups:无需额外基础架构的领导人选举
  4. 一分钟了解阿里云产品:网络安全专家服务
  5. lepus监控oracle数据库_实用脚本一键监控oracle数据库索引使用状况
  6. 来自平时工作中的css知识的积累---持续补充中
  7. stm32的HAL库uart的注意点
  8. 微服务架构设计思维导图总结
  9. 基于 mini2440 电阻式触摸屏(二):S3C2440 电阻式触摸屏接口、内部ADC结构
  10. Flutter Connection to **** was not upgraded to websocket
  11. xpath跨级定位(parent::,following-sibling::, preceding-sibling)
  12. 【渝粤教育】电大中专Windows操作系统_1作业 题库
  13. 手撸一个Switch开关组件
  14. 《数字图像处理》第4讲——线性运算与空间图像增强
  15. BAP:PPP 带宽分配协议 BACP:PPP 带宽分配控制协议--网络大典
  16. js判断浏览器是否打开了控制台
  17. 解决mac idea2020打开闪退问题
  18. Python日志模块
  19. PlSQL和OracleClient
  20. Maven项目配置镜像地址

热门文章

  1. MSRA提出通用文档预训练模型LayoutLM,通往文档智能之路!
  2. UE4材质05 方向和法向
  3. 数字图像处理(3) — 基于白平衡的人脸美白算法
  4. 关于φ与Φ函数与序列中分数个数的讨论
  5. ​力扣解法汇总728-自除数
  6. java二嗨租车项目_Java入门第二季第六章项目实战(租车系统)
  7. Quartus与Modelsim联合仿真ROM IP时输出波形一直为零的问题以及ROM配置仿真教程
  8. 【STM32】LCD液晶显示
  9. 全球都在建智慧城市,智慧城市究竟什么样?中通服创立科技告诉你
  10. python读取csv文件表头_Python读取CSV文件