2個雞蛋100樓問題

2021-08-23 12:17:49 字數 3335 閱讀 4718

兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。

有座100層的建築,要你用這兩個雞蛋確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。

最少需要幾次測試,才能得到摔碎雞蛋的樓層?方案如何?

對於這個問題,如果從程式設計角度而言,最簡單的思路是用動態規劃的思想來解決,不過本文不將其從程式設計角度分析,而是從數學角度對問題進行論述。

對這個問題,原始問題——【100層樓,最少需要幾次測試,才能得到摔碎雞蛋的樓層】,直接考慮不容易考慮,但是,如果將這個問題進行一種等價的轉換,這個問題將會變得非常容易解答。個人認為,這個轉換是解決這個問題的核心,這個轉換是:

轉換問題——【兩個雞蛋,進行k次測試,最多可以測試幾層樓】

如果大家能想到將「原始問題」變為「轉換問題」,這個問題個人認為已經解決一半了,轉換後,這個問題豁然開朗,思路全開。

現在我們以「轉換問題」為模板進行考慮,有兩個雞蛋,第乙個雞蛋如果破碎,第二個雞蛋就必須只能一層一層的測試了,而且,我們要求進行k次測試就將摔碎雞蛋的樓層必須找到.

考慮第一次測試。第一次測試的時候,第乙個雞蛋不能放置的樓層太高了,否則,如果第乙個雞蛋破碎,第二個雞蛋可能不能在k次測試後得到結果。但是也不能放置的矮了,因為如果放置的矮了,第乙個雞蛋破碎了還好說,如果沒破,我們浪費了一次測試機會,也不能說是完全浪費了,不過至少是讓效用沒有最大化。所以,第一次測試的時候必須讓第乙個雞蛋放置的不高不矮。

不高不矮是多高?高到如果第乙個雞蛋破碎後第二個雞蛋剛好能完成k次測試得到結果這個目標。由此可知,第一次測試所在的樓層高度為k,如果第一次測試第一枚雞蛋破碎,則剩下k-1層樓,一層一層的試,k次一定能完成目標。

如果第一次測試,第一枚雞蛋沒有破碎,則我們現在只有k-1次測試機會了,而且直到了k樓及其以下都是安全的了。我們消耗了一次測試機會,但是一次就測試了k層樓。

然後只有k-1次機會了,第二次測試,我們可以在k層的基礎上再增加k-1層了,注意,這個時候由於我們只有k-1次機會,所以這次只能再增加k-1層,以保證測試的時候第一枚雞蛋破碎的情況下仍然能完成任務。

於是,重複上述過程,直到最後一次機會,我們總共測試的樓層數為:

然後,再回到「原始問題」,100層樓,如果需要k次測試才能測試完成,則必須有

則可以得到,k≥14

也就是需要14次測試才能得到結果,而且這個過程也將測試方案一併得出來,就是第一次在14樓測試,如果第一枚蛋碎,則剩餘13次機會,13層未知樓層,恰好,第二次在14+13=27樓測試,如此。

然後,這個問題這個時候還可以擴充套件了,如果我們有三個雞蛋,有k次機會,我們最大可以測試多少層樓?

思路同前面一樣,第一次測試,不能太高也能太矮,必須恰到好處,也就是第一枚雞蛋如果破碎,剩餘k-1次機會能將剩餘樓層給測試完。

由上面結論,k-1次機會最多可以測試k(k-1)/2層樓,所以第一次在k(k-1)/2+1層樓,第一次如果第一枚雞蛋不碎,第二次在此基礎上增加(k-1)(k-2)/2+1層樓,於是,三個雞蛋k次機會總共測試樓層數為

至於四個雞蛋,五個雞蛋,以至於m個雞蛋,可以以此類推,方法同上。

一、題目:

有一棟樓共100層,乙個雞蛋從第n層及以上的樓層落下來會摔破, 在第n層以下的樓層落下不會摔破。給你2個雞蛋,設計方案找出n,並且保證在最壞情況下, 最小化雞蛋下落的次數。

二、思路:

先假設,最小的次數為x次。

首先在x層摔,那麼會出現兩個結果:

1、碎了,為了找出那一層碎了,第二個雞蛋必須從1~x-1進行遍歷的摔

2、沒碎,那麼第二次就在x+(x-1)樓層摔。

為什麼是x+x-1樓層呢?

首先我們已經假設了通過x步我們就能得到答案,現在我們在x層已經用了一次了,那麼就只剩下x-1步了。所以我們選擇x+(x-1)層,如果碎了,我們就能通過x-2步,遍歷x+1~x+(x-1)-1的所有樓層。

3、如果在x+(x-1)樓碎了,那麼同1,遍歷x+1~x+(x-1)-1

4、沒碎,那麼同2,就在x+(x-1)+(x-2)層摔

… 最後我們將會得出這樣乙個樓層公式x+(x-1)+(x-2)+…+1 = x(x+1)/2。

這個公式有什麼意義呢?

有, x(x+1)/2 >= 100,這樣才能順利的解除x。

有人說,x(x+1)/2 = 99就可以,如果雞蛋在99層都沒碎,那麼必定是100層。 我想說誰告訴你記得一定會碎!

那麼我們就順利的解除 x=14。

三、擴充套件

此題還有乙個擴充套件,就是為n個雞蛋從m層摔找出最小值。

那就不是很好手解了,所以寫了**,使用動態規劃原理。動態規劃式子如下:

f[n][m] = 1+max(f[n-1][k-1],f[n][m-k]) k屬於[1,m-1] 解釋下原理:

1、當手裡有n個的時候,雞蛋從k層往下摔,如果破了,那麼手裡只有n-1雞蛋了,那麼就需要測試f[n-1][k-1]樓層。或者更通俗好理解點的,我們運用2個雞蛋100樓層的題目舉例子。以上式子變為:f[2][m]

= 1+max(f[1][k-1],f[2][m-k])   那麼當手裡有2個雞蛋的時候,在k層摔,碎了。那麼現在手裡也就只有乙個雞蛋了,此時我們必須遍歷1~k-1找出第一次碎的樓層。所以為1+f[1][m-k],前面的1代表在k層的操作。

2、沒破,那麼手裡還有n個雞蛋,那麼需要測試k+1~m這些樓層。

此時我想問下,當手裡有2個雞蛋測試1~m-k層和手裡有2個雞蛋測試k+1~m有什麼區別?

有人說有,因為樓層越高越容易碎,那其實是你個人的想法罷了。其實並沒有區別,所以第乙個公式可以寫為f[n][m-k]。

最後附上**,為了理解方便,而不必從陣列從0開始而困擾,這裡就空間多開了點,所以如果拿去用的話,可以優化下:

public

class

eggs

for(int n=2; n<=egg; n++)}}

return f[egg][num];

}public

static

void

main(string args)

}

100樓,2只雞蛋

2只雞蛋,要求用最少次數確定雞蛋可以從多高摔下而不破。雞蛋和樓容易被人鑽牛角尖,所以換個更普通的命題來討論下 有m種 越來越差 的環境 編號1至m 有n個 完全相同 的樣品,樣品在第i種環境下的測試結果有兩種 成功 樣品完全無損 失敗 樣品損壞,無法再用 性質1 若樣品測試第k種情況時成功,表示所有...

100層樓摔雞蛋問題

reference 題目 有一棟100層高樓,從某一層開始扔下的玻璃杯剛好摔壞,現有兩個玻璃杯,最少幾次能找到那一層?首先我要對題目的表述提點意見。這是乙個很有歧義的表述方式,容易誤導人向概率的方向去思考。比如說,我可以回答 最少一次能找到那一層 我就拿個杯子,從一樓起一層一層的摔。從概率上講,有可...

面試題目 2個雞蛋100層樓問題

最樸素的做法是從100層一直扔到 層,不過這樣明顯不是最優的。這題目其實可以轉化為dp求解,假設有 層,你隨機選了一層 如果雞蛋碎了,那麼你只剩乙個雞蛋了,為了確保能夠找到臨界高度,你不得不從第一層往上一層一層扔剩下的乙個雞蛋。如果沒碎呢,你還剩 個雞蛋,但你已經用了一次測試機會。這時候的次數應該為...