扔玻璃珠

/**
*
* 某幢大楼有100层。
*
* 你手里有两颗一模一样的玻璃珠。当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,
* 玻璃珠碎了或者没碎。这幢大楼有个临界楼层。低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,
* 等于或高于它的楼层,扔下玻璃珠,玻璃珠一定会碎。玻璃珠碎了就不能再扔。
*
* 现在让你设计一种方式,使得在该方式下,最坏的情况扔的次数比其他任何方式最坏的次数都少。
* 也就是设计一种最有效的方式。
*/

分析

这段分析来自 http://www.cnblogs.com/grenet/archive/2009/12/20/1628425.html 作者:万仓一黍

这个问题的实质是找出临界楼层。要想使用2个玻璃珠来找到结果,有2类方法。
1、 使用一个玻璃珠从1楼开始一直往上找,第一次玻璃珠碎掉的楼层就是临界楼层。假定为N,那么我们要扔N次。
2、第一次选择在60层扔,若碎了,说明临界点在60层及以下楼层,这时只有一颗珠子,剩下的只能是从第一层,一层一层往上实验,最坏的情况,要实验59次,加上之前的第一次,一共60次。若没碎,则只要从61层往上试即可,最多只要试40次,加上之前一共需41次。两种情况取最多的那种。故这种方式最坏的情况要试60次。

那该如何设计方式呢?
仔细分析一下,关键是第一次的选择,假设在第N层,如果第一次扔的时候就碎了,那么第二颗珠子只能是从第1层开始一层层往上试,此时,最坏的情况为N-1次,加上第一次,则一共为N层。那如果不碎呢,第二颗珠子会从N+1层开始试吗?很显然不会,此时大楼还剩100-N层,问题就转化为100-N,2颗珠子,请设计最有效方式。

定义一个函数F(N),表示N层楼最有效方式最坏情况的次数。
通过上面的分析,有

F(N)=Min(Max(1,1+F(N-1)),Max(2,1+F(N-2)),……,Max(N-1,1+F(1)))
F(1)=1
本面试题就是求F(100)

代码

    /*** 所有的数组的第一位,也就是int[0]是无效的,int[1]表示一楼或者第一次。* @param args*/public static void main(String[] args){int N = 100;//楼层总数int dp[] = new int[N+1];//用于保存第N楼的最佳次数dp[1] = 1;//一楼只需要1次int pos[] = new int[N+1];//pos[10]表示,10层大楼扔玻璃珠的位置pos[1] = 1;//只有1层楼只能在1楼扔//从2层大楼开始for (int i = 2; i <= N; i++) {int min = N;//每层大楼的最坏情况的最少次数for (int j = 1; j < i; j++) {int max = dp[i-j] + 1;if (max < j)max = j;if (min > max) {min = max;pos[i] = j;//记录投掷楼层}}dp[i] = min;}System.out.println(dp[N]);/*找出每次投掷的楼层*/int total = N;//每一次的楼层总数int[] cast = new int[dp[N]+1];//每一次投掷的位置for (int i = 1; i <= dp[N]; i++) {cast[i] = pos[total];total -= cast[i];}for (int i = 1; i <= dp[N]; i++) {cast[i] += cast[i-1];}/*打印结果*/for (int i : cast) {System.out.print(i + " ");}}

运行结果

14
0 9 22 34 45 55 64 72 79 85 90 94 97 99 100

为什么会出现0呢,别忘了int[0]是无效的。所以真正的每次扔玻璃珠的楼层是
9 22 34 45 55 64 72 79 85 90 94 97 99 100

感谢

http://www.cnblogs.com/grenet/archive/2009/12/20/1628425.html 的分析

http://t.cn/RK12kzL Dan2的回答

动态规划-试题(1)-扔玻璃珠相关推荐

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

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

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

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

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

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

  4. java动态规划鸡蛋问题_动态规划系列/高楼扔鸡蛋问题.md · lipengfei/fucking-algorithm - Gitee.com...

    # 经典动态规划问题:高楼扔鸡蛋 今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼.国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得扔鸡蛋 ...

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

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

  6. 算法面试题:扔玻璃杯的学问

    扔玻璃杯的学问 问题简述 在算分研讨班上第一节课听到的有趣问题,据说是鹅厂面试题: 有一种玻璃杯质量确定但未知,需要检测. 有一栋100层的大楼,该种玻璃杯从某一层楼扔下,刚好会碎. 现给你两个杯子, ...

  7. 经典动态规划:高楼扔鸡蛋

    点击蓝色"五分钟学算法"关注我哟 加个"星标",天天中午 12:15,一起学算法 作者 | labuladong 来源 | labuladong 今天要聊一个很 ...

  8. 算法学习笔记——动态规划:高楼扔鸡蛋

    LeetCode 887. 鸡蛋掉落 建筑有n层(取值1,2,...n),存在一个楼层F(0<=F<=n,注意F取值比n多一个),从高于F的楼层扔鸡蛋,鸡蛋会碎:否则鸡蛋不会碎 给你k枚相 ...

  9. 动态规划:高楼扔鸡蛋

    方法一:常规动态规划 1.dp[i][j]数组定义:dp[i][j]表示鸡蛋数量为i,可选楼层数为j的状态下确定F的最少步数,问题所求为dp[K][N] 2.base case:当楼层数为0,步数为0 ...

  10. 谷歌面试题之扔鸡蛋的问题(蓝桥杯摔手机的问题)

    来自一个古老的公众号(摔手机就是根据扔鸡蛋过来的) 吐个槽先 正如昨天所说,这道题据说它最早见于谷歌的某次面试,由于题目表述容易,而解答相对麻烦,于是被很多人采用,广泛见于一些算法.规划的面试里. 要 ...

最新文章

  1. Jackson学习笔记(三)转
  2. android相关使用工具
  3. 什么是设计模式(Design Patterns)
  4. postgresql是如何求年龄的_Postgresql 通过出生日期获取年龄的操作
  5. 真香定律!Android动态换肤实现原理解析,原理+实战+视频+源码
  6. Axure RP chrome插件显示已损坏或者无法安装的解决方法
  7. 计算机网络未来发展5个趋势_Gravel Bike未来发展趋势
  8. retorfit converter使用说明
  9. vue 后端数据成功返回 页面不渲染_vue能获取到数据数据却渲染不到页面上,为什么?...
  10. 编程漫谈及计算机硬件简介
  11. Oracle 条件语句/循环语句
  12. Mysql,Oracle varchar2 字节长度
  13. 第三次打卡 特征工程
  14. 【毕业设计】基于机器学习的餐厅销量预测 -大数据 python
  15. java实现福利彩票抽奖_【福利】快来参与抽奖获得《Java程序设计》
  16. CentOS8安装后切换桌面
  17. 高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了
  18. hadoop命令无法创建目录
  19. AE制作粒子飘雪效果
  20. 计算机学院运动会方阵策划案,运动会方阵策划书模板

热门文章

  1. ​单页应用程序是如何打破网页设计的?
  2. unity shader 溶解,上下左右,cutoff
  3. systemd-journald日志进程介绍
  4. 【独行秀才】macOS Monterey 12.1正式版(21C52)原版镜像
  5. 2015杭州云栖大会
  6. elementUi上传视频组件
  7. DEV的RIchEditControl加载rtf文档时,为mergefield赋值
  8. 【二分答案】JZOJ_3337 wyl8899的TLE
  9. Linux——缺少ld-linux.so.2,lbiz.so.1库文件
  10. 网络编程中常用的fd是什么