zoukankan      html  css  js  c++  java
  • 扔鸡蛋面试题

    链接:https://mp.weixin.qq.com/s/NugGnNX4Vv3SNhQrmzjF-A

    有两个鸡蛋,100层楼,如何准确地测试出哪层鸡蛋会碎?

    有类似二分法,和解方程法。

    设最少次数为x,则可以证明应该x层扔下。若从x+1层扔下,需要扔x+1次;若从x-1层扔下,则需扔x-1次,略保守;所以最后得出一个等式

    x+x-1+x-2+...+1=100.(=层数。

    得出最优是在14层,

    那么分别是14,27,39.。。。。以此类推。

    问题拓展:

    如果是在M层楼,有N个苹果,那么如何判断在几层扔刚好会碎?//这个扩展可真是变态,想不出来。

    链接:https://www.nowcoder.com/questionTerminal/d8a4a3f52d4943c0864caa7c1eb972a7?source=relative
    来源:牛客网

    这是典型的动态规划问题。假设f[n]表示从n层楼找到摔鸡蛋不碎安全位置的最少判断次数。假设第一个鸡蛋第一次从第i层扔下,如果碎了,就剩一个鸡蛋,为确定下面楼层中的安全位置,必须从第一层挨着试,还需要i-1次;如果不碎的话,上面还有n-i层,剩下两个鸡蛋,还需要f[n-i]次(子问题,实体n层楼的上n-i层需要的最少判断次数和实体n-i层楼需要的最少判断次数其实是一样的)。因此,最坏情况下还需要判断max(i-1,f[n-i])次。

    状态转移方程:f[n] = min{ 1 + max(i - 1 ,f[n - i]) | i = 1 ..n } 
    初始条件: f[ 0 ] = 0 (或f[ 1 ] = 1


    现在推广成n层楼,m个鸡蛋:
    还是动态规划。假设f[n,m]表示n层楼、m个鸡蛋时找到摔鸡蛋不碎的最少判断次数。则一个鸡蛋从第i层扔下,如果碎了,还剩m-1个鸡蛋,为确定下面楼层中的安全位置,还需要f[i-1,m-1]次(子问题);不碎的话,上面还有n-i层,还需要f[n-i,m]次(子问题,实体n层楼的上n-i层需要的最少判断次数和实体n-i层楼需要的最少判断次数其实是一样的)。

    状态转移方程:f[n,m] = min{ 1 + max(f[i - 1 ,m - 1 ], f[n - i,m]) | i= 1 ..n }
    初始条件:f[i, 0 ] = 0 (或f[i, 1 ] = i),对所有i
     
    //那么代码怎么写呢?
     
  • 相关阅读:
    面向 部分
    并发 编程
    数据库 部分
    匿名函数
    Linux 30岁,这些年经历了什么?
    漫谈 HTTP 连接
    华为交换机命令基础入门学习,小白也能看得懂!
    一文讲透APaaS平台是什么
    什么是边缘CDN和虚拟CDN (vCDN)?
    systemd进程管理工具实战教程
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/9285726.html
Copyright © 2011-2022 走看看