zoukankan      html  css  js  c++  java
  • 高楼扔鸡蛋

    假设有n层楼,2个鸡蛋。问最少摔几次能够找出恰好把鸡蛋摔坏的楼层。

    这是一个典型的 min(max) 问题。

    解题思路

    动态规划

    第一种思路是,动态规划,这里状态有两个维度:可用鸡蛋个数,待检验楼层个数。
    假设第一次从i层开始摔,如果碎了,还剩一个鸡蛋,只能从一层开始遍历,最坏需要i次;如果没碎,问题转化成n-i个层楼,2个鸡蛋,总次数是 f(n-i,2)+1。

    直观解法,以及二分查找优化,可以参见这篇文章:
    https://zhuanlan.zhihu.com/p/92288604

    边界值

    另一种思考方式,直接构造最佳方案:
    如果第一次在第x层摔碎了,我们最多必然要用x次尝试;如果没碎,我们就从第 x+(x-1) 层开始摔,还不碎就从 x+(x-1)+(x-2) 层开始摔 ……,为什么?
    为了让每种情况下摔的最差次数相同。第一个鸡蛋一下就摔碎,我们查找用x次;第二下摔碎,还是用了x次,第三次才碎还是x次……,最后发现从x层开始摔,可以检验出的楼层个数是 x(x+1)/2 。而恰好,1415/2 > 100,所以能14次就够,并且方案也有了,就从14层开始摔,然后是27层……

  • 相关阅读:
    C++中pair的用法
    DFS例题:力扣200:岛屿数量
    DFS例题:力扣695:岛屿的最大面积
    DFS深度优先遍历
    java AQS源码分析
    spring实现事务原理
    java常见并发面试题目+示例代码
    java并发锁
    ThreadPoolExecutor
    线程通信
  • 原文地址:https://www.cnblogs.com/zhcpku/p/15216603.html
Copyright © 2011-2022 走看看