###扔雞蛋問題
####原題描述 兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋通過最少的次數確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋
####方法分析 看到這個題目,最保險的方法就是一層一層試驗,但這樣只需要乙個雞蛋就可以了。我們現在有兩個雞蛋,完全可以用有更快的方法。
進一步呢?可能試驗的方法是二分查詢,例如,第乙個雞蛋再50層扔下,如果碎了,第二個雞蛋從1-49逐層試驗;如果沒碎,第乙個雞蛋在75層扔下,如果碎了,第二個雞蛋從51-74逐層試驗…但是,這個方法,很容易悲劇,例如,當正好49層是可以安全落下的,需要嘗試50次。比只有乙個雞蛋的情況,效果還要差。
上面的分析都是從雞蛋的角度出發的,想要得到最少的嘗試次數,似乎比較難。那如果我們換個角度,從每個高度的樓層來看呢?如果,某個樓層是可以安全落下的,那麼最少需要多少次嘗試呢?看下面的分析
在我們程式設計解決問題的過程中,如果遇到最優問題的時候,往往可以先嘗試一下動態規劃的方法。而動態規劃的方法,首要的我們要找到構成這個最優問題的最優子問題。所以,下面的分析,我們首先嘗試動態規劃的方法,如何解決這個問題,這也是典型的程式設計師的思路;其次,在眾多的問題當中,有不少可以直接歸結為數學方程式,如果我們能夠寫出數學方程式,那麼,答案將是更加的簡潔、美妙。所以,第二個方法,將嘗試如果總結出數學方程式。 #####基於動態規劃的方法 前面提到,若要採用動態規劃的方法,最重要的是要找到子問題。做如下的分析,假設f表示從第n層樓扔下雞蛋,沒有摔碎的最少嘗試次數。第乙個雞蛋,可能的落下位置(1,n),第乙個雞蛋從第i層扔下,有兩個情況:
碎了,第二個雞蛋,需要從第一層開始試驗,有i-1次機會
沒碎,兩個雞蛋,還有n-i層。這個就是子問題了f 所以,當第乙個雞蛋,由第i個位置落下的時候,要嘗試的次數為1 + max(i - 1, f),那麼對於每乙個i,嘗試次數最少的,就是f的值。狀態轉移方程如下: f = min(1 + max(i - 1, f) ) 其中: i的範圍為(1, n), f = 1 完畢。
######推廣 動態規劃的方法,可以推廣為n層樓,m個雞蛋。如下分析: 假設f表示n層樓、m個雞蛋時找到最高樓層的最少嘗試次數。當第乙個雞蛋從第i層扔下,如果碎了,還剩m-1個雞蛋,為確定下面樓層中的安全樓層,還需要f次,找到子問題;不碎的話,上面還有n-i層,還需要f[n-i,m]次,又乙個子問題。 狀態轉移方程如下: f = min(1 + max(f, f) ) 其中: i為(1, n), f = 1
#####基於數學方程的方法 假設最少嘗試次數為x,那麼,第乙個雞蛋必須要從第x層扔下,因為:如果碎了,前面還有x - 1層樓可以嘗試,如果沒碎,後面還有x-1次機會。如果沒碎,第乙個雞蛋,第二次就可以從x +(x - 1)層進行嘗試,為什麼是加上x - 1,因為,當此時,第乙個雞蛋碎了,第二個雞蛋還有可以從x+1 到 x + (x - 1) - 1層進行嘗試,有x - 2次。如果還沒碎,那第乙個雞蛋,第三次從 x + (x - 1) + (x - 2)層嘗試。碎或者沒碎,都有x - 3次嘗試機會,依次類推。那麼,x次的最少嘗試,可以確定的最高的樓層是多少呢? x + (x - 1) + (x - 2) + … + 1 = x(x+1) / 2 那反過來問,當最高樓層是100層,最少需要多少次呢?x(x+1)/2 >= 100, 得到x>=14,最少要嘗試14次。
【全文完】
@*** 你太二了,如果雞蛋在第四層碎,你第一次50層碎乙個,第二次25層碎乙個,於是你就沒有雞蛋了。。。。
摔雞蛋問題與跳表
摔雞蛋問題 給你k個雞蛋,讓你測試雞蛋殼的硬度,測量的方法就是從不同高度的樓層向下扔,如果雞蛋在第i層摔碎了而在第i 1層沒摔碎,那麼我們就知道雞蛋殼的硬度了,即用層數代表雞蛋殼的硬度。並且假設雞蛋肯定能用某一層的層數來表示。現在的問題是,用k個雞蛋,最壞情況下最少需要多少次才能測試出雞蛋殼的硬度?...
100層樓摔雞蛋問題
reference 題目 有一棟100層高樓,從某一層開始扔下的玻璃杯剛好摔壞,現有兩個玻璃杯,最少幾次能找到那一層?首先我要對題目的表述提點意見。這是乙個很有歧義的表述方式,容易誤導人向概率的方向去思考。比如說,我可以回答 最少一次能找到那一層 我就拿個杯子,從一樓起一層一層的摔。從概率上講,有可...
N個雞蛋從M樓層摔(2個雞蛋從100層摔)
一 題目 有一棟樓共100層,乙個雞蛋從第n層及以上的樓層落下來會摔破,在第n層以下的樓層落下不會摔破。給你2個雞蛋,設計方案找出n,並且保證在最壞情況下,最小化雞蛋下落的次數。二 思路 先假設,最小的次數為x次。首先在x層摔,那麼會出現兩個結果 1 碎了,為了找出那一層碎了,第二個雞蛋必須從1 x...