关于100层楼,扔两个鸡蛋,求摔碎鸡蛋的临界层的问题
题目描述:
两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。
网上有人说可以写动态规划方程来解决,我也没看。不过依我之见,这个问题通过简单的证明就可以得出结论。我们可以直接对n层建筑来分析。
如果我们只有一个鸡蛋,那么只能从最底层,一层一层的做实验,直到鸡蛋摔碎为止。
对于一个x层的楼,做这种实验最坏情况下需要的次数记为f(x).
现在我们有两个鸡蛋,并假设我们已经知道临界层是在[a,b]之间(共b-a+1层),那么我们第一次尝试要从哪层开始呢?假设从第a+k层开始,那么分两种情况
1) 鸡蛋在第a+k层碎了,那么我们接下去要用剩下的那个鸡蛋从第a层开始,一层一层尝试下去,这样最坏情况下还需要尝试k次(a,a+1,…,a+k-1)
2) 鸡蛋在第a+k层没有碎,那么我们就知道了,临界区是在[a+k+1,b]之间(共有b-a-k层),这样我们就把问题转化成为了一个更小的问题了。
以上两种情况,第一种情况下的最坏情况,总共尝试了k+1次,而第二中情况下,最坏的可能是1+f(b-a-k)。因此我们有:
f(b-a+1)=min{max{1+k,1+f(b-a-k)}|0<=k<=b-a}
很容易证明,函数f(x)是随自变量x单调递增的。于是我们有:1+k随着k的增加而单调递增,1+f(b-a-k)随着k的增加而单调递减。我们可以证明,当1+k=1+f(b-a-k)的时候,max{1+k,1+f(b-a-k)}取得最小值。证明如下,假设有任意一个k’!=k,
如果k’>k,那么1+k’>1+k, 1+f(b-a-k’)<1+f(b-a-k).由于1+k=1+f(b-a-k),因此有1+f(b-a-k’)<1+f(b-a-k)=1+k<1+k’
显然有max{1+k’,1+f(b-a-k’)}>max{1+k,1+f(b-a-k)}
如果k’<k,则我们会得到1+k’<1+k=1+f(b-a-k)<1+f(b-a-k’),于是同样得出上述结论。
由上可知,我们第一步所要取的k,就是使得1+k=1+f(b-a-k)的一个值。那么对于n层的楼来说,我们有:
F(n)=1+k1=1+f(n-k1-1)
F(n-k1-1)=1+k2=1+f(n-k1-k2-2)
…
F(1)=1
F(0)=0
由以上一些公式我们可知:
1)1+k1=1+f(n-k1-1)=1+(1+k2),即k1=k2+1,这说明k1,…,km是一些连续的整数
2)n-(k1+1)-(k2+1)-…-(km+1)=0, 说明这些连续的整数(k1+1,…,km+1)的和是n
3)km<=0,说明这些连续的整数(k1+1,…,km+1)是从1开始的
由以上3点,我们可以知道,k1就是满足1+…+(k1+1)=(k1+2)(k1+1)/2=n的那个数。当然,如果找不到一个k1满足(k1+2)(k1+1)/2=n,那么只需要找到一个最小的k1满足(k1+2)(k1+1)/2>n,就行了。
由上可以看出,这道题我们不需要编程序什么的,只需要运用一点点算数小技巧,就可以推理得到答案。对于100层楼的情况,那么由于满足条件的最小k1是13,所以我们第一次就从第k1+1=13+1=14层开始做实验。
关于100层楼,扔两个鸡蛋,求摔碎鸡蛋的临界层的问题相关推荐
- C语言丢鸡蛋100层,关于100层楼,扔两个鸡蛋,求摔碎鸡蛋的临界层的问题
题目描述: 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事.有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置.可以摔碎两个鸡蛋. 网上有人 ...
- 程序员智力题:100层楼扔鸡蛋,确定鸡蛋摔碎的楼层N
程序员笔试智力题:建筑楼有100层,若曾第N层或更高的楼层扔下来,鸡蛋就会摔碎.若从第N层以下的楼层扔下鸡蛋不会摔碎.给你两个鸡蛋,请找出N,并要求最差情况下扔鸡蛋次数最少. 分析:试着从10楼开始扔 ...
- 100层楼扔鸡蛋或者玻璃珠问题
---------------------------以下网上别人的解答---------------------------------------------- 有一栋楼共100层,一个鸡蛋从第N ...
- 两个鸡蛋,100层楼,找出摔碎鸡蛋的最低楼层,所用的摔鸡蛋次数最少
题目:问题:一幢大楼共计100层,某种类型的鸡蛋从某一楼层及其以上楼层摔下来时会被打破,从该层楼(即临界楼层)以下楼层摔下该鸡蛋,鸡蛋不会出现破损.现给你2个完全一样的该种类型的鸡蛋,问:如何通过这2 ...
- 100层楼,最少需要几次测试,才能得到摔碎鸡蛋的楼层
我在腾讯二面碰到了这个问题. 转自:https://blog.csdn.net/Madoka_Homura/article/details/78331152 对于这个问题,如果从编程角度而言,最简单的 ...
- 100层楼扔2个鸡蛋、3个鸡蛋……
原题目 现有2个鸡蛋,楼高100层,假设从n层楼及以上扔下会摔碎,n层以下不会,那么怎样扔能以最小的次数得到n? 分析 最先想起来的是二分法的题目:100层最少需要扔多少次鸡蛋才能求得n?答案是cei ...
- 100层楼和两个玻璃球
有一栋100层高的大楼,给你两个完全相同的玻璃球.假设从某一层开始,丢下玻璃球会摔碎.那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层??? 投掷次数分布不均.按最坏情况估计,这种方法 ...
- 100层楼和两个玻璃球思路解析
有一栋100层高的大楼,给你两个完全相同的玻璃球.假设从某一层开始,丢下玻璃球会摔碎.那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层??? 投掷次数分布不均.按最坏情况估 ...
- 两个软硬程度一样的鸡蛋,它们在某一层摔下会碎,有个100层的建筑,要求最多用两个鸡蛋确 定鸡蛋安全下落的临界位置,给出临界位置?如果是n层楼,m个鸡蛋,请给出确定临界位置的算法
题目:问题:一幢大楼共计100层,某种类型的鸡蛋从某一楼层及其以上楼层摔下来时会被打破,从该层楼(即临界楼层)以下楼层摔下该鸡蛋,鸡蛋不会出现破损.现给你2个完全一样的该种类型的鸡蛋,问:如何通过这2 ...
最新文章
- 排球计分程序(八)——验证编辑方法(Edit method)和编辑视图(Edit view)
- 2018.12.15
- SAP UI5 that.getView().bindElement(that.Context)
- Java——集合(Map集合的两种迭代)
- Python工作笔记-往dll中传入char*类型的参数并且如何接收char*的值
- CS224d lecture 9札记
- mysql gitd 数据结构同步失败_mysql 5.7 gtid主从同步错误修复
- sakai mysql_一个完整的Sakai安装步骤
- 虚拟主机与云服务器的区别
- 2009年1月高等教育国际金融全国统一命题考试
- 用网络命令关闭计算机,如何在win7用cmd命令关闭无线网络
- Oracle卸载:指定数据库的诊断目标位置不存在解决
- 《实施Cisco统一通信管理器(CIPT1)》——导读
- 微信在Ios上h5不能分享
- Java EE现状及其发展趋势
- ABP学习实践(四)--分页查询
- 2023 小额现金贷网络贷款系统源码 支持打包成APP
- EasyRadius——Wayos路由计费的唯一选择
- 【相机标定基于消失点的外参标定】
- 武汉高性能计算大会2022举办,高性能计算生态发展再添新动力
热门文章
- Silver-Slides Chapter 1 - 强化学习入门:基本概念介绍
- Visual Graph常见问题回答(FAQ)
- Python爬虫之xlml解析库
- 眼花缭乱中看Metro Style—MS Apps Store—Desktop Apps以及Win-Runtime和Win32
- word文档中插入图片显示不全解决办法
- 第五周 项目二 建立链栈算法库
- 怎么在小程序中使用彩色图标iconfont
- Keil编程环境背景颜色--护眼色
- 学习笔记(16):C++编程FFMpeg(QT5+OpenCV)实战--实时美颜直播推流-推流基于rtsp协议的大华海康相机...
- android 重置电池信息,安卓手机用re管理器修改电池信息增加待机时间