2个鸡蛋100层楼/2个玻璃珠39层楼
题目描述:
你拿着两个鸡蛋站在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层楼相关推荐
- 100层楼扔鸡蛋或者玻璃珠问题
---------------------------以下网上别人的解答---------------------------------------------- 有一栋楼共100层,一个鸡蛋从第N ...
- 2个鸡蛋100楼问题
https://www.cnblogs.com/yangai/p/5391533.html 博客1 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事. 有座100层的 ...
- Google面试题:扔玻璃珠Matlab实现
题目: 某幢大楼有100层.你手里有两颗一模一样的玻璃珠.当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎.这幢大楼有个临界楼层.低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,等于 ...
- 2017年完美世界校招笔试题,从n层大楼往下扔m颗玻璃珠确定珠子破碎的临界楼层
这道题可以搜索google扔玻璃珠笔试题以及腾讯2017的校招笔试也有一道这样的题,不同的是,以上的题中只是用了两颗玻璃珠,而这里是m颗玻璃珠: 不过,同样是扔珠子,所以思路都是一样,只不过变得更有普 ...
- 你还在用二分法求2个鸡蛋100层楼的问题吗?
题目 2个鸡蛋,100层楼,如何用最少的试验次数得到在鸡蛋落下不碎的最高层数?这一据说曾被谷歌纳入校园招聘题库的经典面试题,想必许多人都曾遇到过,又有多少人与我一样,不加思索就直接回答用二分法查找的? ...
- 2个鸡蛋100层楼--动态规划
原题:两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事.有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置.可以摔碎两个鸡蛋.在最坏的情况下最 ...
- C语言丢鸡蛋100层,关于100层楼,扔两个鸡蛋,求摔碎鸡蛋的临界层的问题
题目描述: 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事.有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置.可以摔碎两个鸡蛋. 网上有人 ...
- 两个鸡蛋100层楼(DP)
#include <iostream> using namespace std;#define N 500 #define max(a,b) (a>b?a:b) #define mi ...
- 面试题目:2个鸡蛋100层楼问题
一道非常经典的面试题目,给你两个鸡蛋,在一幢100层的大楼里面,至少扔几次可以测出让鸡蛋破碎的临界高度? 最朴素的做法是从100层一直扔到1层,不过这样明显不是最优的.这题目其实可以转化为dp求解,假 ...
最新文章
- 广西农产品(广州)交易会 农业大健康·林裕豪:签约农商对接
- python之torchlight使用_python游戏编程之pgzero使用介绍
- jgroups_JGroups:无需额外基础架构的领导人选举
- 一分钟了解阿里云产品:网络安全专家服务
- lepus监控oracle数据库_实用脚本一键监控oracle数据库索引使用状况
- 来自平时工作中的css知识的积累---持续补充中
- stm32的HAL库uart的注意点
- 微服务架构设计思维导图总结
- 基于 mini2440 电阻式触摸屏(二):S3C2440 电阻式触摸屏接口、内部ADC结构
- Flutter Connection to **** was not upgraded to websocket
- xpath跨级定位(parent::,following-sibling::, preceding-sibling)
- 【渝粤教育】电大中专Windows操作系统_1作业 题库
- 手撸一个Switch开关组件
- 《数字图像处理》第4讲——线性运算与空间图像增强
- BAP:PPP 带宽分配协议 BACP:PPP 带宽分配控制协议--网络大典
- js判断浏览器是否打开了控制台
- 解决mac idea2020打开闪退问题
- Python日志模块
- PlSQL和OracleClient
- Maven项目配置镜像地址
热门文章
- MSRA提出通用文档预训练模型LayoutLM,通往文档智能之路!
- UE4材质05 方向和法向
- 数字图像处理(3) — 基于白平衡的人脸美白算法
- 关于φ与Φ函数与序列中分数个数的讨论
- ​力扣解法汇总728-自除数
- java二嗨租车项目_Java入门第二季第六章项目实战(租车系统)
- Quartus与Modelsim联合仿真ROM IP时输出波形一直为零的问题以及ROM配置仿真教程
- 【STM32】LCD液晶显示
- 全球都在建智慧城市,智慧城市究竟什么样?中通服创立科技告诉你
- python读取csv文件表头_Python读取CSV文件