zoukankan      html  css  js  c++  java
  • google 面试题目分析

      有一个100层高的大厦,你手中有两个相同的玻璃围棋子。从这个大厦的某一层扔下围棋
    子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来得知那个临界层面。

      中午猛的又想起google 的那道面试,今天系统的记录一下自己的思路。

      首先,两次要找到临界点,必须区间来找,第一个球找到临界的区间,用第二个球在区间内试。要得到最优的解必须先从问题的根源考虑,玻璃球摔碎的条件是自身的承受力的能力达到自身的极限,不考虑实验过程中球的性能损失等因素(摔裂什么的情况),更具物理知识,受到力的大小Ft = mv2 - mv1,这里我们的初始速度为0F大小和速度成正比。从上到下是一个匀加速的过程,所以应该把速度分成x 个区间,来找最优值。

    速度分成x个区间,必然每个区间的距离是不一样的,但是有联系。

    因为初始速度为0,既然按速度来分区间,于是每个区间的时间是固定的,设为t,先不管分几个区间。

    第一个区间: 2gS1 = (gt)2

    第二个区间: 2gS2 = (2gt)2-(gt)2

    第三个区间 : 2gS3= (3gt)2-(2gt)2 . . .

      事实上,可以发现,每个区间的差值,Sn-S(n-1)是固定值,C = 2(gt)2.

       这样就好办了,假设在100层中,首先在m层试投,然后每隔d 层递减来投(这里的d和上面理论上的差值不是同一个值,上面只是为了确定C是一个常数)。 问题可以简化为,在100 层之内试出临界层,也就是在m投后,在m-d 层投,限制条件为必须在100 层之内出结果 ,表达式为:m+(m-d)+(m-2d)+...+1 >= 100

    等差数列求和的公式 m + {m(m-1)d}/2 >= 100 即:m2+(2-d)m >= 100 限于现有楼层的条件,正整数,求m 的最小值。

    显然 f(m) = m2+(2-d)m 是一个 递增函数,求他的最小值,只有当d 最小的时候,d 1

    得出 m = 14.

    (其实网上面有14 的答案,我这边只是给出这种算法的理由,为什么要分区间,确定以及化解为等差数列,以及等差的确定。使之在理论上成为最优解。)

      

  • 相关阅读:
    nginx安装http2.0协议
    nginx内置变量 大全
    nginx全局查看进程
    Nginx1.14.2新增tcp/udp代理stream
    Nginx Location指令配置及常用全局变量
    Nginx配置udp/tcp代理
    ps -ef|grep详解
    centos7安装nginx(基础篇)
    js转义字符
    redis win连接以及配置连接密码
  • 原文地址:https://www.cnblogs.com/zoro/p/2127300.html
Copyright © 2011-2022 走看看