數學回味系列之10 高樓扔雞蛋

2021-07-27 07:14:33 字數 1399 閱讀 9650

問題提出:

有座100層的建築,雞蛋從某一層扔下來有可能摔碎(可能是1樓,也可能是100樓)。

你手上有兩個軟硬程度一樣的雞蛋,要判斷出來哪一層是雞蛋可以安全落下的最高位置。

最少需要扔多少次?

解題思路:

》 最笨的方法,從1層開始,每層都扔1次,直到摔碎 為止,得到當前當前層數 n。最差需要100次

好像只需要乙個雞蛋就夠了,明顯不對。

》 參照折半搜尋演算法,第乙個雞蛋跑到 第50層扔下,

沒摔碎的話,從第51層開始扔,每次+1;

摔碎的話,從第1層開始扔,每次+1;最差需要50次

二叉樹貌似也不太靠譜,哈哈。

》 多折幾次看看:

雞蛋一: 10、20、30、40……  

雞蛋二: x+1、x+2、x+3、x+4……

這回靠譜了吧? 最差只需要20次了。

這個方案有乙個問題:

如果在10層第乙個雞蛋就碎了,那麼 total 最多是11次;

20層                                              最多   12次

30層                                              最多   13次

》 問題就是不均勻,很明顯我們能想到等差數列。

假設 最少判斷次數為 x,雞蛋一第一次從第x層扔(不管碎沒碎,還有x-1次嘗試機會)。

如果碎了,雞蛋二在1~x-1層中線性搜尋,最多x-1次;

如果沒碎,雞蛋一第二次從x+(x-1)層扔(現在還剩x-2次嘗試機會)。

如果這次碎了,雞蛋二在x+1~x+(x-1)-1層中線性搜尋,最多x-2次;

如果沒碎雞蛋一再從x+(x-1)+(x-2)層扔,依此類推……

x 次嘗試所能確定的最高樓層數為x+(x-1)+(x-2)+...+1 = x(x+1)/2

針對200樓層的情況,可以得到 x = 14,最少需要14次。

其實這是乙個動態規劃問題,給出c++**:

/* linolzhang 2009.11

drop eggs

*/#include #include #include int drop[9999][99]; // drop[i][j]: 表示在 i 層樓 還有 j 個雞蛋的最小判斷次數

void solve(int layers, int eggs) }}

int main()

妙 高樓扔雞蛋的數學解法

數學方法 參考 關於高樓扔雞蛋問題,本文只對動態規劃方法進行概括性的描述,具體看這裡。k個雞蛋 n 層樓,問至少嘗試多少次可以找到雞蛋不碎的臨界樓層,求最少次數m 設dp k n 表示k個雞蛋n層樓要嘗試的最少次數 dp k n min 1 x n min min1 x n max dp k 1 x...

數學回味系列之3 賽馬問題

問題提出 共有25匹馬,有乙個賽場,賽場有5個賽道,就是說最多同時可以有5匹馬一起比賽。假設每匹馬都跑的很穩定 可多次比賽 只通過馬與馬之間的比賽,沒有計時器,試問,最少需要多少場比賽才能知道跑得最快的3匹馬?解題思路 根據題目,我們首先想到的就是 1 隨機分成5組,各5匹馬,5場比賽得到 各組第1...

數學回味系列之13 殺豬問題

問題提出 有 n 頭豬 和 乙個 的屠夫 屠夫就喜歡殺單數字置上的豬,一次殺完之後,將剩下的豬按照原來的相對位置,重新排列 按照約定,最後一頭豬 取名lucky 將會被送到教堂,這是神的旨意。請問,最聰明的豬應該站在哪個位置,才能成為這個幸運兒?解題思路 分析這個問題,我們發現,奇數字是危險的,每一...