C语言丢鸡蛋100层,关于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+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层开始做实验。
C语言丢鸡蛋100层,关于100层楼,扔两个鸡蛋,求摔碎鸡蛋的临界层的问题相关推荐
- 关于100层楼,扔两个鸡蛋,求摔碎鸡蛋的临界层的问题
题目描述: 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事.有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置.可以摔碎两个鸡蛋. 网上有人 ...
- 两个鸡蛋,100层楼,找出摔碎鸡蛋的最低楼层,所用的摔鸡蛋次数最少
题目:问题:一幢大楼共计100层,某种类型的鸡蛋从某一楼层及其以上楼层摔下来时会被打破,从该层楼(即临界楼层)以下楼层摔下该鸡蛋,鸡蛋不会出现破损.现给你2个完全一样的该种类型的鸡蛋,问:如何通过这2 ...
- 100层楼,最少需要几次测试,才能得到摔碎鸡蛋的楼层
我在腾讯二面碰到了这个问题. 转自:https://blog.csdn.net/Madoka_Homura/article/details/78331152 对于这个问题,如果从编程角度而言,最简单的 ...
- 2017年完美世界校招笔试题,从n层大楼往下扔m颗玻璃珠确定珠子破碎的临界楼层
这道题可以搜索google扔玻璃珠笔试题以及腾讯2017的校招笔试也有一道这样的题,不同的是,以上的题中只是用了两颗玻璃珠,而这里是m颗玻璃珠: 不过,同样是扔珠子,所以思路都是一样,只不过变得更有普 ...
- 两个软硬程度一样的鸡蛋,它们在某一层摔下会碎,有个100层的建筑,要求最多用两个鸡蛋确 定鸡蛋安全下落的临界位置,给出临界位置?如果是n层楼,m个鸡蛋,请给出确定临界位置的算法
题目:问题:一幢大楼共计100层,某种类型的鸡蛋从某一楼层及其以上楼层摔下来时会被打破,从该层楼(即临界楼层)以下楼层摔下该鸡蛋,鸡蛋不会出现破损.现给你2个完全一样的该种类型的鸡蛋,问:如何通过这2 ...
- 100层楼扔鸡蛋或者玻璃珠问题
---------------------------以下网上别人的解答---------------------------------------------- 有一栋楼共100层,一个鸡蛋从第N ...
- 100层楼扔2个鸡蛋、3个鸡蛋……
原题目 现有2个鸡蛋,楼高100层,假设从n层楼及以上扔下会摔碎,n层以下不会,那么怎样扔能以最小的次数得到n? 分析 最先想起来的是二分法的题目:100层最少需要扔多少次鸡蛋才能求得n?答案是cei ...
- 两个鸡蛋测试:从100层楼往下扔鸡蛋,求最坏情况下确认保证鸡蛋可以不破的最大楼层所需次数
最坏情况下求得最优解所需的次数 内容说明 本文是在看过<<妙解谷歌压箱底面试题:如何正确的从楼上抛鸡蛋>>一文以后做的总结,该文章对此问题描写的很详细,但是在拜读的过程中也花了 ...
- 你还在用二分法求2个鸡蛋100层楼的问题吗?
题目 2个鸡蛋,100层楼,如何用最少的试验次数得到在鸡蛋落下不碎的最高层数?这一据说曾被谷歌纳入校园招聘题库的经典面试题,想必许多人都曾遇到过,又有多少人与我一样,不加思索就直接回答用二分法查找的? ...
最新文章
- 35岁老码农:老板,你看我还有机会吗?
- 解读2019华为第001号文件:AI时代软件开发的第一要义是可信
- Doracle.jdbc.J2EE13Compliant=true
- WCF和webservice的区别
- ChannelHandler 与 ChannelPipeline 详解
- SugarCRM 去掉 header 应用程序 下拉菜单
- NetSuite 在中国 - 一个全程信息化管理平台
- 129 MySQL数据类型(重要)
- 20191128每日一句感恩节
- 人事面试100问题--巧妙应答
- 拉普拉斯逆变换matlab,利用MATLAB实现拉普拉斯变换及其逆变换.doc
- 第一次部署海康威视DEMO的一些坑,最终运行成功
- vue-tippy优秀悬浮框插件的两种使用方式(解决elementui的tooltip不及时消失及定位出错问题,使用el-progress进度条模仿柱状图,tippy模仿echarts悬浮框)
- 前端开发学习(七七)
- 算法创作|什么是数据结构
- HDU5619 Jam's store(最小费用最大流 MCMF)
- native-JavaScript通信流程( 基于最新的 react native版本 )
- 【腾讯云】云服务器 Nginx 内网访问 COS 省流量费
- linux 的vim快速查找内容
- 精彩回顾 | 苏州农商银行新一代云原生信息科技架构体系实践
热门文章
- java图形界面美化_Java图形界面设计——substance皮肤
- 黑马程序员最新版JavaWeb基础教程最后的案例学习记录
- 怎么备份织梦网站数据 网站备份教程
- vue+element实现鼠标移入出现按钮,并点击图片可跳转页面
- TapTap玩家评论——从爬虫到情感分析:APP爬虫、数据清洗、Pyecharts可视化、Word2Vec建模、LSTM建模
- linux luks分区加密,Linux下分区加密LUKS
- php正则获取table,[正则]分析获取table表格
- 浩易南:真假人脉圈子和行业精英
- Linux基础知识5:通配符、进程管理、命令替换符、转义符、shell元字符、ascii码对照表
- Android仿苹果siri浮动控件