1. 程式人生 > >100層樓,2個雞蛋問題

100層樓,2個雞蛋問題

題目描述:
一道非常經典的面試題目,給你兩個雞蛋,在一幢100層的大樓裡面,至少扔幾次可以測出讓雞蛋破碎的臨界高度?

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

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

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

=================================================

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

================================================

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

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

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

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

=====================================================

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

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

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

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

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

 k+(k-1)+(k-2)+(k-3)+......+1

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

 k+(k-1)+(k-2)+(k-3)+......+1 = k(k+1)/2 >=100

則可以得到,k≥14

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

如果不是100層,而是N層,需要的測試次數為k,則有
 推導公式

=========================================================

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

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

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

推導公式

k=9.

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

轉自:http://blog.sina.com.cn/s/blog_6c813dbd0101bh98.html