【LintCode】254. 丟雞蛋

樓有 n 層高榛鼎,雞蛋若從 k 層或以上扔逃呼,就會碎。從 k 層以下扔者娱,就不會碎抡笼。
現(xiàn)在給兩個雞蛋,用最少的扔的次數(shù)找到 k黄鳍。返回最壞情況下次數(shù)推姻。

【要求】找到x層落下不會碎, x+1層落下會碎的臨界層所需要的最少嘗試次數(shù) r(r for result)

【假設(shè)】

  • 只有1雞蛋測試框沟,需要從1層開始一層一層實驗藏古,最壞次數(shù)為k
  • 如果有兩個雞蛋,第一個雞蛋用來試探, 只要它從 k 層樓扔下去沒碎, 則目標就在[k+1, n]之間了.但一旦運氣不好碎了, 對于已知的區(qū)間, 我們只能用剩下一個雞蛋從小到大一層層試,因為我們要保證策略必須成功, 不能冒險了.
    "最壞情況下代價最小"這句話十分重要, 它反映了題目的重要數(shù)學結(jié)構(gòu):
    我們可以把任何一種策略都看成一個決策樹,每一次扔雞蛋都會有兩個子節(jié)點, 對應(yīng)碎與不碎的情況下下一步應(yīng)該扔的樓層.
    那么, 策略的一次執(zhí)行, 是樹中的一條從根往下走的路,當且僅當這條路上出現(xiàn)過形如 k 沒碎 與 k+1 碎了的一對節(jié)點時, 路停止, 當前節(jié)點不再擴展.
    那么要找的是這么一棵樹, 使得所有路里最長者盡量短, 也即, 要找一個最矮的決策樹.
    再看一個節(jié)點處, 選擇樓層時會發(fā)生什么.
    容易看出, 選擇的樓層如果變高, 那么"碎子樹"高度不減, "不碎子樹"高度不增.
    同樣的, 選擇的樓層變矮的話, "碎子樹"高度不增, "不碎子樹"高度不減.
    這時候答案很明顯了: 為了使兩子樹中高度最大者盡量小, 我們的選擇應(yīng)當使兩子樹高度盡量接近.
    最終希望的結(jié)果是, 整個二叉樹盡量像一個滿二叉樹.
  • 假設(shè)第一次在根節(jié)點上, 我們選擇扔k層, 其"碎子樹"的高度顯然是k - 1.
    為了考慮不碎子樹的高度, 設(shè)不碎后第二次扔m層(顯然m > k ),
    則這個新節(jié)點的碎子樹高度為 m - k - 1, 不碎子樹高度仍然未知,
    但按照滿二叉樹的目標, 我們認為它與碎子樹相同或少1就好.
    那么在根節(jié)點上的不碎子樹的高度就是m -k-1 + 1, 令它與碎子樹高度相同, 于是:
    m - k - 1 + 1 = k - 1 => m = k + k - 1
    也即, 如果第一次扔在k層, 第二次應(yīng)該高k-1 層, 這可以有直觀一點的理解:每扔一次, 就要更保守一些, 所以讓區(qū)間長度少1. [1, k) -> [k + 1, 2k - 1).用類似剛才的分析, 可以繼續(xù)得到, 下一次應(yīng)該增高k - 2, 再下一次應(yīng)該增高k - 3.

如果大樓100層, 考慮:
k + (k-1) + (k-2)+...+3+2+1 = (k+1)*k/2 =100 =>k ~= 14
所以第一次扔14層, 最壞需要14次(策略不唯一, 樹的葉子可以交換位置).
以上是數(shù)學做法...當然還有代碼做法....
設(shè)f(n, m)為n層樓, m個蛋所需次數(shù), 那么它成了一道DP題..

f(0,m) = 0,(m>=1)
f(h,1) = n,(h>=1)
f(h,m) = (1->k->n)min{max{f(k-1,m-1), f(h-k, m)}} + 1
即:


f(h,m) = (1->k->n)min{max{f(k-1,m-1), f(h-k, m)}} + 1.png
public class Solution {
    /**
     *
     * @param n 樓層
     * @return  最壞情況最少的次數(shù)
     */
    public int dropEggs(int n){
         long k = 0;
        for (int i = 1; ; ++i) {
            k += (long)i;
            if (k >= (long)n)
                return i;
        }
    }

另外一種暴力方法:

public int dropEggs(int n) {
        long x = n;
        double x1 = (Math.sqrt(x * 8 + 1) - 1) / 2;
        return (int)Math.ceil(x1);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忍燥,一起剝皮案震驚了整個濱河市拧晕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灾前,老刑警劉巖防症,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哎甲,居然都是意外死亡,警方通過查閱死者的電腦和手機饲嗽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門炭玫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人貌虾,你說我怎么就攤上這事吞加。” “怎么了尽狠?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵衔憨,是天一觀的道長。 經(jīng)常有香客問我袄膏,道長践图,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任沉馆,我火速辦了婚禮码党,結(jié)果婚禮上德崭,老公的妹妹穿的比我還像新娘。我一直安慰自己揖盘,他們只是感情好眉厨,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兽狭,像睡著了一般憾股。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上箕慧,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天服球,我揣著相機與錄音,去河邊找鬼销钝。 笑死有咨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蒸健。 我是一名探鬼主播座享,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼似忧!你這毒婦竟也來了渣叛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤盯捌,失蹤者是張志新(化名)和其女友劉穎淳衙,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饺著,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡箫攀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了幼衰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靴跛。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渡嚣,靈堂內(nèi)的尸體忽然破棺而出梢睛,到底是詐尸還是另有隱情,我是刑警寧澤识椰,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布绝葡,位于F島的核電站,受9級特大地震影響腹鹉,放射性物質(zhì)發(fā)生泄漏藏畅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一种蘸、第九天 我趴在偏房一處隱蔽的房頂上張望墓赴。 院中可真熱鬧竞膳,春花似錦、人聲如沸诫硕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽章办。三九已至锉走,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藕届,已是汗流浹背挪蹭。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留休偶,地道東北人梁厉。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像踏兜,于是被迫代替她去往敵國和親词顾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353