目录

前言:

题目:

解析:

总结:


博客主页:张栩睿的博客主页

欢迎关注:点赞+收藏+留言

系列专栏:c语言学习

        家人们写博客真的很花时间的,你们的点赞和关注对我真的很重要,希望各位路过的朋友们能多多点赞并关注我,我会随时互关的,欢迎你们的私信提问,也期待你们的转发!

希望大家关注我,你们将会看到更多精彩的内容!!!

前言:

我是纯路人,这个标题单纯是为了让大家和坤坤一起好好学习!

题目:

有2个只因蛋,从100层楼上往下扔,以此来测试坤蛋的硬度。比如坤蛋在第9层没有摔碎,在第10层摔碎了,那么坤蛋不会摔碎的临界点就是9层。

问:如何用最少的尝试次数,测试出只因蛋不会摔碎的临界点?

首先要说明的是这道题你要是一上来就说出正确答案,那说明你的智商不是超过160就是你做过这题。

所以建议你循序渐进的回答,一上来就说最优解可能结果不会让你和面试官满意。

解析:(正经解答)

1.暴力法

举个栗子,最笨的测试方法,是什么样的呢?把其中一个鸡蛋,从第1层开始往下扔。如果在第1层没碎,换到第2层扔;如果在第2层没碎,换到第3层扔.......如果第59层没碎,换到第60层扔;如果第60层碎了,说明不会摔碎的临界点是第59层。

在最坏情况下,这个方法需要扔100次。

2. 二分法

采用类似于二分查找的方法,把鸡蛋从一半楼层(50层)往下扔。

如果第一枚鸡蛋,在50层碎了,第二枚鸡蛋,就从第1层开始扔,一层一层增长,一直扔到第49层。

如果第一枚鸡蛋在50层没碎了,则继续使用二分法,在剩余楼层的一半(75层)往下扔......

这个方法在最坏情况下,需要尝试50次。

3.均匀法

如何让第一枚鸡蛋和第二枚鸡蛋的尝试次数,尽可能均衡呢?

很简单,做一个平方根运算,100的平方根是10。

因此,我们尝试每10层扔一次,第一次从10层扔,第二次从20层扔,第三次从30层......一直扔到100层。

这样的最好情况是在第10.20.30...90层碎掉,尝试次数为 1 + 9 = 10次。

最坏的情况是在第100层碎掉,尝试次数为 10 + 9 = 19次。

不过,这里有一个小小的优化点,我们可以从15层开始扔,接下来从25层、35层扔......一直到95层。

这样最坏情况是在第95层碎掉,尝试次数为 9 + 9 = 18次。

4.最优解法

最优解法是反向思考的经典:如果最优解法在最坏情况下需要扔X次,那第一次在第几层扔最好呢?

答案是:从X层扔

假设最优的尝试次数的x次,为什么第一次扔就要选择第x层呢?

这里的解释会有些烧脑,请小伙伴们坐稳扶好

假设第一次扔在第x+1层:

如果第一个鸡蛋碎了,那么第二个鸡蛋只能从第1层开始一层一层扔,一直扔到第x层。

这样一来,我们总共尝试了x+1次,和假设尝试x次相悖。由此可见,第一次扔的楼层必须小于x+1层。

假设第一次扔在第x-1层:

如果第一个鸡蛋碎了,那么第二个鸡蛋只能从第1层开始一层一层扔,一直扔到第x-2层。

这样一来,我们总共尝试了x-2+1 = x-1次,虽然没有超出假设次数,但似乎有些过于保守。

假设第一次扔在第x层:

如果第一个鸡蛋碎了,那么第二个鸡蛋只能从第1层开始一层一层扔,一直扔到第x-1层。

这样一来,我们总共尝试了x-1+1 = x次,刚刚好没有超出假设次数。

因此,要想尽量楼层跨度大一些,又要保证不超过假设的尝试次数x,那么第一次扔鸡蛋的最优选择就是第x层。

那么如果没有摔碎,第二次你只剩下x-1次机会,按照上面的说法,你第二次尝试的位置必然是X+(X-1);因为这个样子的话,最坏的情况也会是x次找到,因为会从x+1开始找,找到2*X-1的位置,此时最坏也是2+x+1-2*x-1=x。

以此类推我们可得:

x + (x-1) + (x-2) + ... + 1 = 100

这个方程式不难理解:

左边的多项式是各次扔鸡蛋的楼层跨度之和。由于假设尝试x次,所以这个多项式共有x项。

右边是总的楼层数100。

下面我们来解这个方程:

x + (x-1) + (x-2) + ... + 1 = 100  转化为

(x+1)*x/2 = 100

最终x向上取整,得到 x = 14

因此,最优解在最坏情况的尝试次数是14次,第一次扔鸡蛋的楼层也是14层。

最后,让我们把第一个鸡蛋没碎的情况下,所尝试的楼层数完整列举出来:

14,27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100

举个栗子验证下:

假如鸡蛋不会碎的临界点是65层,那么第一个鸡蛋扔出的楼层是14,27,50,60,69。这时候啪的一声碎了。

第二个鸡蛋继续,从61层开始,61,62,63,64,65,66,啪的一声碎了。

因此得到不会碎的临界点65层,总尝试次数是 6 + 6 = 12 < 14 。

下面是我个人的理解:

        这个似乎更像是优化版的均匀法,因为我们在均匀以后,不管在哪个区间,找最坏的情况都是x种,而均匀法让你第二次尝试不超过10,但是第一次的位置无法保证(最多要9次,最好一次),他所在的楼层区间的最坏情况都不太一样。而最优解法由于每多一次尝试,楼层间隔就-1,最终使得第一次与第二次的和(既每个区间的最差情况)都是完全均匀的。

总结:

今天的每日一道智力题让我们学会了许多方法,如:暴力枚举法,二分法,均匀法,逆向思维法。最优解的核心思路是逆向思考,因为即使理解了需要两次的和均匀也很难得到第一次要在哪层楼扔。一旦理解了这种方法,多少层楼你都不会怕啦。这就是今天的每日一题,希望大佬们可以点赞收藏!您的支持是我创造的动力!最后,其实我是真爱粉!

【每日一道智力题】之高楼扔只因蛋相关推荐

  1. 每日一道算法题:高楼扔鸡蛋问题(动态规划问题)

    题目是这样:你面前有一栋从 1 到N共N层的楼,然后给你K个鸡蛋(K至少为 1).现在确定这栋楼存在楼层0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于F的楼层都会碎,低 ...

  2. 【每日一道智力题】之海盗分金币(上)

    文章目录 题目: 解答: 题目变形: 解答: 总结 题目: 5个海盗抢到了100枚金币,每一颗都一样的大小和价值. 他们决定这么分: 抽签决定自己的号码(1,2,3,4,5) 首先,由1号提出分配方案 ...

  3. 【每日一道智力题】之猴子搬香蕉

    题目 一个小猴子边上有100根香蕉,它要走过50米才能到家,每次它最多搬50根香蕉,(多了就被压坏了),它每走1米就要吃掉一根,请问它最多能把多少根香蕉搬到家里.(提示:他可以把香蕉放下往返的走,但是 ...

  4. 【每日一道智力题】之聪明的犯人!

    题目: 一百个犯人站成一纵列,每人头上随机带上黑色或白色的帽子,各人不知道自己帽子的颜色,但是能看见自己前面所有人帽子的颜色. 然后从最后一个犯人开始,每人只能用同一种声调和音量说一个字:" ...

  5. 【每日一道智力题】之 药瓶毒鼠鼠

    题目: 有1000个一模一样的瓶子,其中有999瓶是普通的水,有1瓶是毒药.任何喝下毒药的生命都会在一星期之后死亡.现在你只有10只鼠鼠和1个星期的时间,如何检验出哪个瓶子有毒药? 这是一道经典的面试 ...

  6. 【每日一道智力题】之 赛马找最快

    问题: 25匹马5条跑道找最快的3匹马,需要跑几次?  将25匹马分成ABCDE5组,假设每组的排名就是A1>A2>A3>A4>A5,用边相连,这里比赛5次第6次,每组的第一名 ...

  7. 【每日一道智力题】三个火枪手(快来看人生哲理)

  8. 【每日一道智力题】之坤坤猜生日(面试高频)

  9. 亚马逊的一道智力题,悬链线问题

    亚马逊的一道智力题,悬链线问题   感觉这阵子网上开始流传一道题,号称是亚马逊的面试题,问题挺有意思.大致是这样. 有一根无弹性的绳子,长度是80m,然后两端被挂在50m高的柱子上,问当绳子的中点离地 ...

最新文章

  1. 若依管理系统导出Excel时添加没有的列和关联码表显示中文进行导出
  2. java类加载器_java底层内功 第一章,类加载器的任性
  3. 在SharePoint环境中更换密码
  4. PHP笔记-打印99乘法表例子
  5. Raid 原理及创建软raid
  6. 聋校计算机教学工作总结,聋校二年级数学教学工作总结
  7. 小技巧 - LeetCode 如何查看他人耗时更优的代码答案?
  8. 小白进阶——Mike21(一)
  9. 广义pareto分布_帕累托分布广义帕累托分布
  10. 五类/超五类/六类/超六类/七类等多类网线的比较
  11. 论文写作,word首页脚注不显示编号
  12. 黑客帝国「缸中之脑」真的可以,这100万个「活体人脑细胞」5分钟学会打游戏...
  13. java 获得文本框文本_Java获取和删除Word文本框中的表格
  14. easySearch:一款聚合资源搜索神器
  15. 2023计算机毕业设计SSM最新选题之javaJava班级信息管理系统x0w9c
  16. 【机器学习实战笔记】Logistic回归
  17. 泰国80亿互联网记录数据库泄漏,疑遭黑客攻击
  18. 脏读、幻读、不可重复读,傻傻分不清楚
  19. Jodconverter-最新无码爽具,你值得拥有!
  20. Android版本10和20有什区别,荣耀v10和v20哪个好?荣耀V20和荣耀V10区别对比

热门文章

  1. 【读书笔记】【More Effective C++】技术(Techniques,Idioms,Patterns)
  2. 【sql】sql必知必会_01
  3. docker运行yyets_docker 后台运行和进入后台运行的容器
  4. rotate(旋转)
  5. 学生HTML静态网页设计作业成品【汽车商城、汽车租赁、汽车销售】HTML+CSS+JS购物商城
  6. 跟着Nature学绘图!基于ggplot2的生存曲线绘制R包
  7. java 抽象类 注入,依赖注入 抽象类
  8. Activity生命周期学习总结
  9. 【C#开发宝典】.匡松等(奋斗的小鸟)_PDF 电子书
  10. signature=62a94db18a1c22c5e92df335032a67cf,Print Cradle For Retaining Pagewidth Print Cartridge