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
     
    //那么代码怎么写呢?
     
  • 相关阅读:
    Python学习杂记_2_格式化字符串的一些操作
    Python学习杂记_1_PyCharm使用的一些收获
    学习总结——接口测试中抓包工具的使用
    学习总结——JMeter做WebService接口功能测试
    学习总结——JMeter做http接口压力测试
    学习总结——JMeter做http接口功能测试
    学习总结——Postman做http接口功能测试
    学习总结——接口测试基础
    伊始
    python 内置函数
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/9285726.html
Copyright © 2011-2022 走看看