無意間看到這個題目,想了很久纔想通(IQ偏低),而且網上很多文章的描述得不是很清楚,在此分享一下個人看法,隨便記錄一下,如有不對的對方,歡迎指正,謝謝!
問題:有一棟100層高的大樓,給你兩個完全相同的玻璃球。假設從某一層開始,丟下玻璃球會摔碎。那麼怎麼利用手中的兩個球,用什麼最優策略知道這個臨界的層是第幾層?
1、在這裏我們先忽略最優策略的解決方案
(1)最簡單的辦法就是從底層(1L)逐層往上(100L)嘗試,最多要99次才能確定破碎樓層(即100L破碎)。
(2)針對(1)的方案改進一下,第一個球用折半嘗試,第二個球用逐層嘗試,最多要50次才能確定破碎樓層(即50L破碎)。
(3)考慮對100L層樓分成N段(N=100的平方根,即10段、每段10L),用第一個球來確認球在哪個段破碎,然後用第二個球在該樓層段逐層嘗試,最多要19次才能確定破碎樓層(N+9)
2、最優策略的解決方案
爲了使最壞情況的投擲數最小,我們希望無論臨界段在哪裏,總的投擲數都不變,也就是說投擲數均勻分佈。
這裏可以看成是針對(3)的優化方案。
第一步:確定臨界段(初步確認破碎樓層範圍)
第二步:確定臨界層(逐層嘗試破碎樓層)
描述:爲了使投擲數均勻分佈(假設最多投擲N次),所以
臨界段標號 | 1 | 2 | 3 | ... | i |
臨界層層數L | N | N-1 | N-2 | ... | N-i+1 |
臨界段範圍D | 1~N | D1 + 1 ~ D1 + L2 | D2 + 1 ~ D2 + L3 | ... | Di-1 + 1 ~ Di-1 + Li |
最多投擲次數 | N | N | N | N | N |
由於N取值範圍(1~N),所以
當N等於1時,確認臨界段最多需要C1次(即1次);
當N等於2時,確認臨界段最多需要C2次(即2次);
......
當N等於N-1時,確認臨界段最多需要Cn-1次(即N-1次);
當N等於N時,確認臨界段最多需要Cn次(即N次);
所以
C1+C2+C3+...+Cn >= 100
=> 1+2+3+...+N >= 100
=> N(N+1)/2 >= 100 (因爲N是正整數)
=> N >= 14
=> N=14
臨界段標號 | 1 | 2 | 3 | ... | i |
臨界層層數L | 14 | 13 | 12 | ... | N-i+1 |
臨界段範圍D | 1~14 | 15~14+13 | 28~27+12 | ... | Di-1 + 1 ~ Di-1 + 1 + Li-1 |
最多投擲次數 | 14 | 14 | 14 | 14 | 14 |
比如39層,玻璃碎了:
用第一個球依次從14層、27層、39層拋下(39層碎了,共3次)
用第二個球依次從28層、29層、30層、31層、32層、33層、34層、35層、36層、37層、38層拋下(因爲27層沒碎,共11次)