演算法 扔玻璃珠

2021-09-17 00:19:12 字數 1111 閱讀 1050

題目

某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠一定會碎。玻璃珠碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞的情況扔的次數比其他任何方式最壞的次數都少。也就是設計一種最有效的方式。

分析1)最笨的辦法:從第一層開始試,每次增加一層,當哪一層扔下玻璃珠後碎掉了,也就知道了。不過最壞的情況扔的次數可能為100。 

2)隨便挑一層,假如為n層,扔下去後,如果碎了,那就只能從第一層開始試了,最壞的情況可能為n;假如沒碎,就一次增加一層繼續扔吧,這時最壞的情況為100-n。也就是說,採用這種辦法,最壞的情況為max。之所以要加一,是因為第一次是從第n層開始扔。 

3)假如沒摔的話,不如不要一次增加一層繼續扔吧,而是採取另外一種方式:把問題轉換為100-n,在這裡面找臨界樓層,這樣不就把問題轉換成用遞迴的方式來解決。

定義乙個函式f(n),表示n層樓最有效方式最壞情況的次數; 

通過上面的分析,有 

f(n)=min( 

max(1,1+f(n-1)), 

max(2,1+f(n-2)) 

… max(n-1,1+f(1)) 

); f(1)=1; 

求f(100);

int floor1(int n)

//上一層備忘錄,儲存雞蛋數量-1的floornum層樓條件下的最優化嘗試次數

int precache[floornum+1];

//當前備忘錄,儲存當前雞蛋數量的floornum層樓條件下的最優化嘗試次數

int currentcache[floornum+1];

//把備忘錄每個元素初始化成最大的嘗試次數

for(int i=1;i<=floornum; i++)

for(int n=2; n<=eggnum; n++)

for(int m=1; m<=floornum; m++)}}

return currentcache[floornum];

}int main()

Google面試題 扔玻璃珠

某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠一定會碎。玻璃珠碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞...

高樓扔玻璃球

大廈有100層,你手裡有兩顆玻璃球。當你拿著玻璃球在某一層往下扔的時候,一定會有兩個結果,玻璃球碎了或者沒碎。大廈有個臨界樓層。低於它的樓層,往下扔玻璃球,玻璃球不會碎,等於或高於它的樓層,扔下玻璃球,玻璃球一定會碎。玻璃球碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞的情況扔的次數比其...

演算法 扔雞蛋問題

演算法第三次上機c題 問題描述 假設有兩個相同的玻璃球,你想確定100層樓中最低樓層,當它們從這層樓掉下來的時候會摔碎。假設球在這一層以下掉落時沒有損壞。什麼策略可以最大限度地減少試驗的跌落次數?假設我們只有乙個球。我們必須從每一層按順序從1降到100,最壞的情況下需要100次。現在想想我們有兩個球...