有乙個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次。
**:
100層樓扔兩個雞蛋問題
解釋 兩個雞蛋一樣,只有在達到某個樓層高度時,才會摔碎。可以假設這個摔碎臨界樓層是n。可見,用二分法結果很不穩定,特別是n小於50時最糟糕 甚至會比第一種直接遍歷的還要多一次 n越大越好找,需要嘗試的次數越少。如果這個題目換成雞蛋個數不限制,那就是用二分法最快了。當最高樓層為100時,可列出不等式 ...
100層樓扔兩個雞蛋
兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。最少需要幾次測試,才能得到摔碎雞蛋的樓層?方案如何?問題轉化 兩個雞蛋,扔k次,最多測試多少層樓?假設第乙個雞蛋從m層扔下...
100層樓摔雞蛋問題
reference 題目 有一棟100層高樓,從某一層開始扔下的玻璃杯剛好摔壞,現有兩個玻璃杯,最少幾次能找到那一層?首先我要對題目的表述提點意見。這是乙個很有歧義的表述方式,容易誤導人向概率的方向去思考。比如說,我可以回答 最少一次能找到那一層 我就拿個杯子,從一樓起一層一層的摔。從概率上講,有可...