Eggs Dropping puzzle(2 eggs, 100 floors)

題目如下:

You are given two eggs, and access to a 100-storey building. Both eggs are identical. The aim is to find out the highest floor from which an egg will not break when dropped out of a window from that floor. If an egg is dropped and does not break, it is undamaged and can be dropped again. However, once an egg is broken, that is it for that egg.

If an egg breaks when dropped from floor n, then it would also have broken from any floor above that. If an egg survives a fall, then it will survive any fall shorter than that.

The question is: What strategy should you adopt to minimize the number egg drops it takes to find the solution?. (And what is the worst case for the number of drops it will take?)

  • 問題一: 只有一個雞蛋的時候值朋, 如何測試
    如果我們只有一個雞蛋瘾英, 我們知道雞蛋一旦碎了关串, 我們就沒有雞蛋了。 所以我們要找出這個使得雞蛋恰好碎的critital floor樓層茄袖, 我們只能從第一層開始向上一層一層的找访雪。
    所以最壞的情況下九秀, 我們需要扔100次才能找到(即要么在100層遗嗽, 要么在100層也不會碎)。

  • 問題二: 現(xiàn)在我們有兩個雞蛋鼓蜒, 我們該如何測試呢痹换?
    我們可以從第50層開始扔征字, 這樣我們就可以把我們的問題的規(guī)模減為一半了。 有兩種可能:
    (1)蛋碎了娇豫, 我們知道critical floor在50層樓以下匙姜。 但是此時我們手里還剩下一只雞蛋, 我們沒有別的辦法冯痢, 只能從第一層開始一層層的往上找氮昧。 最壞的情況下我們需要檢查: 1(對應(yīng)著第一個出師未捷的蛋) + 49 = 50次

    (2) 蛋沒有碎。 此時我們比較lucky系羞, 然后繼續(xù)用這個蛋進行二分測試。
    無論如和霸琴, 我們?nèi)ド鲜鰞煞N情況最壞的情況椒振, 即50次了。

  • 問題三: 能否做的更好
    所以做的更好梧乘, 就是我們使得最壞情況下澎迎, 扔的次數(shù)是最小的。 我們可以選擇按照如下的方式扔雞蛋选调。
    選擇10floor的strategy夹供。 也就是選擇第一只雞蛋:先從10層開始扔, 如果碎了仁堪, 就用第二個雞蛋check 1-9層哮洽。 如果沒有碎, 繼續(xù)用這一個雞蛋從20層開始扔弦聂, 一直進行下去鸟辅。
    最壞的情況下(即最大的扔雞蛋的次數(shù)):
    到90次的時候第一個雞蛋還沒有碎。 但是在100次的時候碎了莺葫。然后我們用第二個雞蛋測試從91層開始匪凉, 一層層的測試。 我們的次數(shù)是: 10(第一個蛋) + 9 = 19次捺檬。
    好的這個策略遠好于第一個策略再层。

  • 問題四: 還能做到更好嗎?
    我們可以選擇minimization of maxmum regret的策略堡纬。

上述的辦法是采用的等差數(shù)列的方式扔雞蛋聂受。 現(xiàn)在我們換個策略。 只要我們的第一個雞蛋不碎烤镐, 我們就減少增加的樓層數(shù)進行扔雞蛋饺饭。 這樣就使得一旦我們的第一個雞蛋碎了, 那么使用第二個雞蛋測試所需要的次數(shù)的是遞減的职车。 例如第一個雞蛋在第一層就碎了與第一個雞蛋在第二層碎了這兩種可能對應(yīng)的導(dǎo)致的第二個雞蛋的測試次數(shù)是遞減的瘫俊。
如何找到第一個雞蛋最開始的扔雞蛋的層數(shù)鹊杖。 我們按照如下方式計算出來:
(1)第一個雞蛋從樓層n開始向下扔, 如果碎了扛芽, 使用第二個雞蛋一層層檢查前面(n-1)層樓骂蓖。
(2)如果第一個雞蛋沒有碎, 那么接下來川尖, 我們從2n - 1層開始往下扔登下。 也就是說此時我們又向上走了n -1層開始扔第一個雞蛋。 如果碎了叮喳, 用第二個雞蛋檢查前面n -1 層被芳。 沒有碎, 繼續(xù)向下扔第一個雞蛋馍悟。畔濒。
(3)第一個雞蛋沒有碎, 在樓層n + n - 1 + n -2 = 3n -3處扔雞蛋锣咒。
依次進行下去侵状。

我們有如下公式:
n + (n-1) + (n-2) + (n-3) + (n-4) + … + 1 >= 100
于是得到:
n (n+1) / 2 >= 100
計算得到:
n = 13.651。
我們?nèi)eiling毅整, 得到n = 14.
所以我們測試的情況如下:


測試情況

最壞的情況是我們?nèi)恿?4次趣兄。 也就是我們第一次扔第一個蛋的時候, 這個悲催的家伙就碎了悼嫉。 然后我們只能從一層開始向上艇潭, 逐層的用第二個蛋檢查:
1 + 13 = 14。
下面我們使用動態(tài)規(guī)劃求解這個題戏蔑。
n個雞蛋暴区, k層樓。
一個問題要想搭上動態(tài)規(guī)劃這趟高速列車辛臊, 那么這個問題的結(jié)構(gòu)必須擁有如下兩個優(yōu)秀的特點仙粱。
(1)最優(yōu)子結(jié)構(gòu)
如果雞蛋從x層向下扔的時候,會出現(xiàn)兩個case:
– case 1: 雞蛋碎了彻舰, 此時我們需要使用剩下的雞蛋n - 1(假如我們有n 個雞蛋)個雞蛋去檢查下面的x - 1層樓伐割。

 k ==> Number of floors
 n ==> Number of Eggs
 eggDrop(n, k) ==> Minimum number of trails needed to find the critical floor in worst case.
  eggDrop(n, k) = 1 + min{max(eggDrop(n - 1, x - 1), eggDrop(n, k - x)): x in {1, 2, ..., k}}

(2) 重疊子問題
這個很容易看出來。
算法思路圖:

算法思路圖

遞歸版本的編程實現(xiàn):

        static int max(int a, int b) => a > b ? a : b;

        /// <summary>
        /// Eggdrop the specified n and k.
        /// </summary>
        /// <returns>The eggdrop.</returns>
        /// <param name="n">雞蛋數(shù)</param>
        /// <param name="k">樓層數(shù)</param>
        static int eggdrop(int n, int k)
        {
            if (n == 1)
            {
                return k;
            }
            if (k == 0||k==1)
            {
                return k;
            }
            int min = Int32.MaxValue;
            int x, res;
            for (x = 1; x <= k;x++)
            {
                res = max(eggdrop(n-1,x-1),eggdrop(n,k-x));
                if(res<min){
                    min = res;
                }
            }
            return min + 1;
        }

來源

需要注意的是刃唤,遞歸的效率特別慢隔心,我們需要記住一句話,就是:

任何遞歸都可以用迭代去替換

這里要怎么用迭代去替換遞歸尚胞,我還在思考當中硬霍。。笼裳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唯卖,一起剝皮案震驚了整個濱河市粱玲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拜轨,老刑警劉巖抽减,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異橄碾,居然都是意外死亡卵沉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門法牲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來史汗,“玉大人,你說我怎么就攤上這事拒垃⊥W玻” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵恶复,是天一觀的道長怜森。 經(jīng)常有香客問我速挑,道長谤牡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任姥宝,我火速辦了婚禮翅萤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腊满。我一直安慰自己套么,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布碳蛋。 她就那樣靜靜地躺著胚泌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肃弟。 梳的紋絲不亂的頭發(fā)上玷室,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天饼酿,我揣著相機與錄音滴肿,去河邊找鬼续徽。 笑死拳话,一個胖子當著我的面吹牛何缓,可吹牛的內(nèi)容都是我干的油坝。 我是一名探鬼主播盒让,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼搜锰,長吁一口氣:“原來是場噩夢啊……” “哼汗贫!你這毒婦竟也來了身坐?” 一聲冷哼從身側(cè)響起秸脱,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掀亥,沒想到半個月后撞反,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡搪花,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年遏片,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撮竿。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡吮便,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幢踏,到底是詐尸還是另有隱情髓需,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布房蝉,位于F島的核電站僚匆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搭幻。R本人自食惡果不足惜咧擂,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望檀蹋。 院中可真熱鬧松申,春花似錦、人聲如沸俯逾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桌肴。三九已至皇筛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坠七,已是汗流浹背水醋。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灼捂,地道東北人离例。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像悉稠,于是被迫代替她去往敵國和親宫蛆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容