• 高楼扔鸡蛋


    假设有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层……

  • 相关阅读:
    ecmall 开发一个新模块
    ecmall 如何新增挂件
    ecmall 主从表的4种模型关系
    ecmall 的一些方法说明
    ecmall 支付成功 订单状态没有改变解决办法
    ecmall 基础类分析
    phpcms 新建模块安装
    phpcms pc_base::load
    strptime()方法
    GDB调试方法精粹
  • 原文地址:https://www.cnblogs.com/zhcpku/p/15216603.html
Copyright © 2020-2023  润新知