轉載自:http://blog.sina.com.cn/s/blog_6c813dbd0101bh98.html
兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。
有座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樓測試,如此。
如果不是100層,而是N層,需要的測試次數為k,則有
=========================================================
然后,這個問題這個時候還可以擴展了,如果我們有三個雞蛋,有k次機會,我們最大可以測試多少層樓?
思路同前面一樣,第一次測試,不能太高也能太矮,必須恰到好處,也就是第一枚雞蛋如果破碎,剩余k-1次機會能將剩余樓層給測試完。
由上面結論,k-1次機會最多可以測試k(k-1)/2層樓,所以第一次在k(k-1)/2+1層樓,第一次如果第一枚雞蛋不碎,第二次在此基礎上增加(k-1)(k-2)/2+1層樓,於是,三個雞蛋k次機會總共測試樓層數為
至於四個雞蛋,五個雞蛋,以至於M個雞蛋,可以以此類推,方法同上。此處原理講通,就不推導了。
=====================================================
題目變形:
鏈接:https://www.nowcoder.com/questionTerminal/287575fa30804a8b9085ca1747a69b6e
來源:牛客網
由於諾基亞手機不止可以當作手機使用,還可以作為磚頭防身,人人的員工小丁想測一測它從多高才能摔破。借助人人公司所在的靜安中心大樓(共 27 層),小丁准備從 1 層開始一層一層的將諾基亞手機扔下去,直到摔破為止,顯而易見,在最壞的情況下需要扔 27 次才能測出這個臨界值(假定頂層的高度一定可以摔破這部諾基亞手機),小丁跟同事小李說了這個想法,小李說他這也有一部同型號的諾基亞手機,正好不用了給了小丁,現在小丁手中有兩部諾基亞手機。