面试算法03-高楼扔球求临界破碎楼层

且看题:

有100层楼,已知从某层扔下玻璃球会碎,给你两个玻璃球,请用最优策略实验出临界的破碎楼层

注意题,是给出最优实验策略,我们可不能拿一个小球从一层开始扔,然后一层一层往上加,这样的话最坏的情况下会扔99次(因为99层不管碎没碎,我们都知道结果了),而且还浪费了一个球。
那既然有两个球,可不可以用简单的折半法呢,比如50层扔一个,没碎的话,用另一个球从51层往上扔,最坏的情况下是1+49=50次,如果碎了的话,我们再折半,从25层扔另一个球,嗯,又碎了,然后呢,然后没球了(┬_┬)
可见以上两种扔法都不能解出此题,但仔细想想,以上两种扔法都有一个共同点,也是解此题的关键,即:两次扔球的区间间隔!第一种扔法看似么有区间,其实可以看作区间为0,第二种区间为50,此题求最优策略(注意不是最少),可以理解为无论临界楼层是几层,这种策略的最多扔球次数都是一样的,那么我们的扔球区间该怎么选呢?
假设我们第一次扔球从第n层扔:

  1. 如果碎了,那么第二颗球就应该从第一层往上扔,最坏次数为1 +(n - 2)- 1 + 1 = n - 1次,解释一下,即:第一次扔球次数 1加上本次实验最高层减去最底层并加1,n - 2层是最后一次实验的楼层,因为已知n层碎了,当扔到第n-2层的时候不管碎没碎我们都知道结果了,至于为什么最高层减去最低层后要加1,举个简单的例子,3-5之间会实验多少次,[3,4,5]层 = 5-3+1次。
  2. 如果没碎,那么接着用第一颗试,第二次扔的楼层是多少呢?我们理想的结果是不管哪层是临界层,扔的总次数都是一样 的,所以我们第二次往上选楼层的时候就得在第一次的楼层上减1,因为第一次扔球已经占用一次扔球次数,所以第二次扔的楼层为n +(n-1)层。
  3. 如果第二次扔球碎了,那么第二颗球应该从 n+1层开始往上扔一直扔到 n +(n-1) - 2 层,最坏的情况下的总次数为 2 + ((n +(n-1) - 2) - (n + 1) + 1)= n - 1次,可以看到最坏次数和上次一样!
  4. 如果第一颗球第二次选择的楼层还没碎呢?那么同理,第一颗球第三次选择的楼层应该为n +(n-1)+(n-2)层。
  5. 我们继续以上推理,当第一颗球一直都没碎的情况下,我们继续往上选择的楼层会变成这个样子:
    n +(n-1)+(n-2)+(n-3)+ ··· + 2 + 1
    而到最后我们选择的楼层一定已经大于等于最高层,因为最后的那个+1存在,所以才会有大于,而为什么会要这个+1,我们是为了将其凑整成一个数列,以上数列即为从1一直加到n,而这个数列与楼层的关系可以简化成:
    n ( n + 1 ) 2 \frac {n(n+1)}{2} 2nn+1 >= 100 即:n(n + 1) >= 200
    由此可解,n >=14 即最优解的第一次扔球应该从第14层扔下玻璃球,下面给出具体扔法:
    '14  1  2  3  4  5  6  7  8  9 10 11 12',
    '14 27 15 16 17 18 19 20 21 22 23 24 25',
    '14 27 39 28 29 30 31 32 33 34 35 36 37',
    '14 27 39 50 40 41 42 43 44 45 46 47 48',
    '14 27 39 50 60 51 52 53 54 55 56 57 58',
    '14 27 39 50 60 69 61 62 63 64 65 66 67',
    '14 27 39 50 60 69 77 70 71 72 73 74 75',
    '14 27 39 50 60 69 77 84 78 79 80 81 82',
    '14 27 39 50 60 69 77 84 90 85 86 87 88',
    '14 27 39 50 60 69 77 84 90 95 91 92 93',
    '14 27 39 50 60 69 77 84 90 95 99 96 97',

由上可以看出,最优策略为第一次扔的楼层为14层,最多扔13次。

你可能感兴趣的:(算法学习)