百層樓扔棋子問題

有一個100層高的大廈,你手中有兩枚相同的玻璃棋子。從這個大廈的某一層扔下圍棋子就會碎。用你手中的這兩枚圍棋子,找出一個最優的策略,來得知那個“臨界”層面——
    第一次應該從哪層開始扔?
    以你的方案,最壞的情況多少次可以測出臨界層?
    這是一道Google的面試試題,具體來源不得而知,網上有無數解法,諷刺的是,Google自己搜到的大部分解法都是錯的。3月份的《程序員》雜誌刊登了這到題目,但我分析了一下,對雜誌上給出的答案(起始測試層)也有疑問。這並不是什麼了不得的難題吧(////),網上的答案集中在19次,18 次,16次和15次,我現在找到的策略是14次。我敢說超過15次的策略一定不是最優的,那麼14一 是不是最優的呢?呵呵,我們來分析一下。
    假設你從50層開始扔第一枚棋子。如果第一枚棋子碎了,你就要從第1層開始逐層試探,最壞的情況是臨界層在第49層,這樣你總共測試了49+1=50次;如果第一枚棋子沒碎,你可以把它拿到——比如說——75層,再試,如果這次碎了,另一枚棋子就要從51層試驗到74層,這樣總共試驗了2+ (74-51+1)=26次……以此類推,總之,最壞的情況,你要試驗50次。
    現在假設你從10層開始扔第一枚棋子,假如第一枚棋子沒有碎,則之後每10層扔一次。跟上面相同的道理,假如臨界層在第87層,總共經歷了9+(87-81+1)=16次試驗;最壞的情況當然是臨界層在第99層,你要試驗10+(99-91+1)=19次。
    顯而易見,如何把大樓“分段”成爲解決問題的關鍵。“段”分得合理,就可以讓試驗次數減少。那麼,是讓每段包含的層數均勻分佈好一些,還是讓投擲次數分佈均勻好一些呢?如果是前者,平均分段後那麼19次就是最優策略了。如果是後者,首先的解決方案是:嘗試逐漸減少分段所包含的層數(否則隨着第一枚棋子測試層數的累加,最壞的情況下總的投擲次數也有所增加),我們假設第一次扔棋子的層數爲n,之後逐層遞減,可以考慮這樣一個不等式:
    n+(n-1)+(n-2)+...+2+1>=100
    也就是:
    n(n+1)/2>=100
    n^2+n>=200
    可以得到(取整數)
    n>=14
    於是就有了我們的方案:從第14層開扔第一枚棋子,如果它沒有破碎,則從第14+13=27層開始扔,還是沒有破碎就從14+13+12=39層開始扔,以此類推;如果第一枚棋子39層破碎了,則以第二枚棋子從第28層試驗到第38層,總共試驗次數爲3+(38-28+1)=14次。

    按照這個策略,可測試到第14+13+12+...+4=99層。假如第99層還沒有破碎,那麼臨界層就是第100層,總共測試了11次。如果99破碎了,那麼分別在第96,97,98層用第二枚棋子進行第12,13,14次投擲(第10次投擲第一枚棋子在95層),最壞的情況是98層破碎,總共試驗次數也是14次。


轉自:http://zgd1st.blogbus.com/logs/6143417.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章