Google面試題 扔玻璃珠

2021-06-19 07:57:54 字數 1274 閱讀 4093

某幢大樓有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歲的侄子解釋什麼是資料...