有趣的扔雞蛋問題

2021-08-21 05:09:52 字數 2217 閱讀 7454

題目:扔雞蛋問題

有2個雞蛋,從100層樓上往下扔,以此來測試雞蛋的硬度。比如雞蛋在第9層沒有摔碎,在第10層摔碎了,那麼雞蛋不會摔碎的臨界點就是9層

問:如何用最少的嘗試次數,測試出雞蛋不會摔碎的臨界點?

舉個例子,最笨的測試方法是什麼樣呢?

把其中乙個雞蛋從第1層開始往下扔。

如果在第1層沒碎,換到第2層扔

如果在第2層沒碎,換到第3層扔

.......

如果第59層沒碎,換到第60層扔

如果第60層碎了,說明不會摔碎的臨界點是第59層

在最壞情況下,這個方法需要扔100次。

方法一:二分法

採用類似於二分查詢的方法,把雞蛋從一半樓層(50層)往下扔。

如果第一枚雞蛋在50層碎了,第二枚雞蛋就從第1層開始扔,一層一層增長,一直扔到第49層。

如果第一枚雞蛋在50層沒碎了,則繼續使用二分法,在剩餘樓層的一半(75層)往下扔......

這個方法在最壞情況下,需要嘗試50次。

方法二:平方根法

如何讓第一枚雞蛋和第二枚雞蛋的嘗試次數盡可能均衡呢?

很簡單,做乙個平方根運算,100的平方根是10。

因此,我們嘗試每10層扔一次,第一次從10層扔,第二次從20層扔,第三次從30層......一直扔到100層。

這樣的最好情況是在第10層碎掉,嘗試次數為 1 + 9 = 10次。

最壞的情況是在第100層碎掉,嘗試次數為 10 + 9 = 19次。

不過,這裡有乙個小小的優化點,我們可以從15層開始扔,接下來從25層、35層扔......一直到95層。

這樣最壞情況是在第95層碎掉,嘗試次數為 9 + 9 = 18次。

巧妙的解法:解方程法

假設問題存在最優解,這個最優解的最壞情況嘗試次數是x次。那麼,我們第一次扔雞蛋恰恰應該選第x層。選擇高一層或低一層都不合適

究竟為什麼呢?下面分析一下

假設第一次扔在第x+1層:

如果第乙個雞蛋碎了,那麼第二個雞蛋只能從第1層開始一層一層扔,一直扔到第x層。

這樣一來,我們總共嘗試了x+1次,和假設嘗試x次相悖。由此可見,第一次扔的樓層必須小於x+1層。

假設第一次扔在第x-1層:

如果第乙個雞蛋碎了,那麼第二個雞蛋只能從第1層開始一層一層扔,一直扔到第x-2層。

這樣一來,我們總共嘗試了x-2+1 = x-1次,雖然沒有超出假設次數,但似乎有些過於保守。

假設第一次扔在第x層:

如果第乙個雞蛋碎了,那麼第二個雞蛋只能從第1層開始一層一層扔,一直扔到第x-1層。

這樣一來,我們總共嘗試了x-1+1 = x次,剛剛好沒有超出假設次數。

因此,要想盡量樓層跨度大一些,又要保證不超過假設的嘗試次數x,那麼第一次扔雞蛋的最優選擇就是第x層。

如果第一次扔雞蛋是在第x層,並且沒有打算,那麼第二次扔雞蛋是在哪一層呢?

由於第一次扔雞蛋沒有碎,嘗試次數消耗一次,那麼嘗試次數不得超過x-1次,

嘗試次數上限變成了x-1次,所以第二次嘗試的樓層跨度也是x-1層,絕對樓層是x+x-1層

同理,如果雞蛋還是沒有碎,第三次樓層跨度是x-2,第四次x-3,第五次......

因此可以列出乙個樓層數的方程式:

這個方程式不難理解:

左邊的多項式是各次扔雞蛋的樓層跨度之和。由於假設嘗試x次,所以這個多項式共有x項。

右邊是總的樓層數100。

下面我們來解這個方程:

x + (x-1) + (x-2) + ... + 1 = 100 轉化為

(x+1)*x/2 = 100

最終x向上取整,得到 x = 14

因此,最優解在最壞情況的嘗試次數是14次,第一次扔雞蛋的樓層也是14層。

最後,讓我們把第乙個雞蛋沒碎的情況下,所嘗試的樓層數完整列舉出來:

14,27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100

舉個例子驗證下:

假如雞蛋不會碎的臨界點是65層,那麼第乙個雞蛋扔出的樓層是14,27,50,60,69。這時候啪的一聲碎了。

第二個雞蛋繼續,從61層開始,61,62,63,64,65,66,啪的一聲碎了。

因此得到不會碎的臨界點65層,總嘗試次數是 6 + 6 = 12 < 14 。

參考自程式設計師小灰的訂閱號

扔雞蛋問題

因為就乙個雞蛋,所以,我們很容易就可以想到從第一層開始扔就可以了,直到碎,說明這是n 1層。這裡當然也可以按照第乙個問題的方法來實現,即從第一層開始向上,直到摔碎為止,但是這種方法顯然是低效的。方法二 二分查詢 當時就想到了使用這種方法,即採用二分查詢的思路,第一次在50層扔 如果碎了,那麼從第一層...

扔雞蛋問題

因為就乙個雞蛋,所以,我們很容易就可以想到從第一層開始扔就可以了,直到碎,說明這是n 1層。這裡當然也可以按照第乙個問題的方法來實現,即從第一層開始向上,直到摔碎為止,但是這種方法顯然是低效的。方法二 二分查詢 當時就想到了使用這種方法,即採用二分查詢的思路,第一次在50層扔 如果碎了,那麼從第一層...

扔雞蛋問題

標籤 演算法 初始問題 在100層樓裡,給定2個雞蛋,在安全樓層以上的樓扔雞蛋會碎。設計一種方案,測試哪層樓是最高安全樓層,要求測試次數最少。思路 這是典型的動態規劃問題。假設 f n 表示從 n 層樓找到摔雞蛋不碎安全樓層的最少判斷次數。假設第乙個雞蛋第一次從第 i 層扔下,如果碎了,說明安全樓層...