某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠一定會碎。玻璃珠碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞的情況扔的次數比其他任何方式最壞的次數都少。也就是設計一種最有效的方式。
當然,為了這一顆玻璃珠代價也高了點,還是採取另外一種辦法吧。隨便挑一層,假如為n層,扔下去後,如果碎了,那就只能從第一層開始試了,最壞的情況可能為n。假如沒碎,就一次增加一層繼續扔吧,這時最壞的情況為100-n。也就是說,採用這種辦法,最壞的情況為max。之所以要加一,是因為第一次是從第n層開始扔。
不過還是覺得不夠好,運氣好的話,挑到的n可能剛好是臨界樓層,運氣不好的話,要扔的次數還是很多。不過回過頭看看第二種方式,有沒有什麼發現。假如沒摔的話,不如不要一次增加一層繼續扔吧,而是採取另外一種方式:把問題轉換為100-n,在這裡面找臨界樓層,這樣不就把問題轉換成用遞迴的方式來解決嗎?看下面:
假如結果都儲存在f[101]這個陣列裡面,那麼:
f[n]=100-n,
f[100]=min(max(1,1+f[n-1]),max(2,1+f[n-2]),……,max(n-1,1+f[1]));
看出來了沒有,其實最終就是利用動態規劃來解決這個問題。
下面是自己隨便寫的c++**:
c++語言: codee#8489
01#include
02usingnamespacestd; 03
04intf[101]=; 05
06voidtest() 07
18
}19} 20
21intmain() 22
輸出結果為14。也就是說,最好的方式只要試14次就能夠得出結果了。
---------------------------------------------
答案是先從14樓開始拋第一次;如果沒碎,再從27樓拋第二次;如果還沒碎,再從39樓拋第三次;如果還沒碎,再從50樓拋第四次;如此,每次間隔的樓層少一層。這樣,任何一次拋棋子碎時,都能確保最多拋14次可以找出臨界樓層。
證明如下:
3、所以,設n是第一次拋棋子的最佳樓層,則n即為滿足下列不等式的最小自然數:
不等式如下:
1+2+3+...+(n-1)+n
>=
100
由上式可得出n=14
即最優的策略是先從第14層拋下,最多拋14次肯定能找出臨界樓層。
演算法 扔玻璃珠
題目 某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠一定會碎。玻璃珠碎了就不能再扔。現在讓你設計一種方式,使得在該方式下...
Google經典燒腦面試題 扔雞蛋問題思路整理
問題 有一棟樓,共100層。定義 雞蛋在第n層樓扔下,不會碎,第n 1層扔下,會碎,那麼第n層就叫臨界樓層 你手中有兩個雞蛋 預設理想狀態 兩個雞蛋完全相同 如何優化嘗試策略,使得使用最少次數,測出臨界樓層 即,使用此策略,最差也可以在多少次以內測出臨界樓層 ps 假定雞蛋一定會在某層樓下落後碎掉 ...
Google 的面試題
一輛學校班車裡面能裝多少個高爾夫球?你被縮小到只有硬幣厚度那麼點高 不是壓扁,是按比例縮小 然後被扔到乙個空的玻璃攪拌器中,攪拌刀片一分鐘後就開始轉動。你怎麼辦?要是讓你清洗整個西雅圖的所有窗子,你會收取多少費用?怎麼才能識別出電腦的記憶體堆疊是向上溢位還是向下溢位?你要向你8歲的侄子解釋什麼是資料...