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 的答案,我这边只是给出这种算法的理由,为什么要分区间,确定以及化解为等差数列,以及等差的确定。使之在理论上成为最优解。)

      

  • 相关阅读:
    POJ 3126 Prime Path
    POJ 2429 GCD & LCM Inverse
    POJ 2395 Out of Hay
    【Codeforces 105D】 Bag of mice
    【POJ 3071】 Football
    【POJ 2096】 Collecting Bugs
    【CQOI 2009】 余数之和
    【Codeforces 258E】 Devu and Flowers
    【SDOI 2010】 古代猪文
    【BZOJ 2982】 combination
  • 原文地址:https://www.cnblogs.com/zoro/p/2127300.html
Copyright © 2011-2022 走看看