zoukankan      html  css  js  c++  java
  • 丢鸡蛋问题的解法

        十分惭愧,水平有限,更新博文速度太慢。太慢的原因应该归结于人太懒惰,水平也有限;或是本人太自以为是,自认为有意思的东西才会发表博文,像今天早上喝了豆浆吃了包子这种炫富的事情我是不会更新到博客的,我不喜欢炫耀自己早晨可以吃得这么好。

        言归正传,今天分享的是我解一个题目的思路。当然我是自认为这个题目有意思,有研究的价值。题目如下:

    “你拿着两个鸡蛋站在100层的大楼上。鸡蛋或许结实到从楼顶掉下也不会摔破,或许很易碎,在一楼摔下就破碎。最少试验多少次可以找出鸡蛋不会被摔碎的最高楼层?”

    第一眼看到这个题目,审错题,没注意是两个鸡蛋,就贸然得出了结果:二分查找的变型,2^7 = 128,特点在于最优和最劣都是7次才能找出最高楼层。

    第二眼发现是只有两个鸡蛋,那么这个题目趣味性一下子上来了。

    我的解法如下:

      思路:你要选择一个楼层丢鸡蛋,这个鸡蛋会有两种情况。碎和不碎,当碎的情况所需要的次数和不碎的情况所需要的次数相等时,达到最优。这是最经典的分而治之的思路。

    但对于有意思的题目我总想再搞点花样出来。如下:

      设函数f(x,y),其中x是扔鸡蛋的次数,y是当前具有的鸡蛋个数。 f(x,y)的结果是参数x,y所能确定的最高层数。

      那么f(x,2) = f(x-1,2) + f(x-1,1) + 1     

      而f(x-1,1) = x-1     //只有一个鸡蛋时,你只能从最底层一层一层往上试

      则 f(x,2)  = x+(x-1) + ... + 1 = (1+x)*x/2

      目前要求的问题是:

      f(x,2) >= 100 且 f(x-1,2)<100

      求出来 x=14

      按照这个解法,得出来实际过程是:

        1+2+。。。+14  = 105

          所以第一次丢是在第14层。

      如果碎了 那么剩下的最后一个鸡蛋从第1层开始丢,不碎就+1层,14次可以试出来。

          如果在14层丢没碎,则下一次在(14+13)=27层丢,次数少了一次,但是确定的层数也少了一个可确定的最大层数。

      最终你发现这是一个递归问题,最终不管碎不碎,都是14次。

          值得表扬的是,我会文字高亮了!

          谢谢大家看到最后,本人水平有限,如有失误之处欢迎指点。本人邮箱 rongguozhen@foxmail.com

  • 相关阅读:
    Java高级面试题及答案
    Java SQL注入学习笔记
    Java实习生面试题整理
    各大公司Java面试题超详细总结
    Java面试经典题:线程池专题
    Java进阶面试题列表
    最新Java面试题及答案整理
    Java虚拟机(JVM)你只要看这一篇就够了!
    记一次Java的内存泄露分析
    Java线程池详解
  • 原文地址:https://www.cnblogs.com/MrWrong/p/3792212.html
Copyright © 2011-2022 走看看