床の卵はまだ問題があります

序文

(非プログラミングの問題フィナーレタイトルなど)新入生ブルーブリッジカップ地方大会遭遇し、この時間は、他の誰かの顔が繰り返し登場してご覧くださいブログの要約を書くこと。

タイトル

100層は、建物の合計がありますが、卵は上の階と中断されませんドロップ下記のN番目の階層内のN番目の層から落ちるスマッシュ。次の2個の卵を付け、Nを見つけ設計し、中にいることを保証するために、最悪の場合、卵の数を最小限に落ちます。

解決

いいえ、脳の二分法ません(ほとんどの人が疑似ソリューションを考えます)

その時に節度に注意を払っていない地方大会、思考のこの方法は、あなたが最初の必要がで、それを決定する最悪求めて、ケースの状態最小限に抑えるために、それは脳の二分法なしで、確かではないが、試行回数をとても簡単、例えば、初めてまだあなた第50フロアは、あなたが25階に直接、半分を選択した場合分割し、壊れて、2個の卵がなくなって、あなたは、ああ、あなたがたみては?一層のみから次の層49 1つのテストずつ、そして最終的に試行回数が50回であるとすることができますので。

仮定法

:第一に、それは試みの最小数がまだ開始からのx、この時点でx層である答えは、2例があることを前提としてい

  • 壊れ、それが唯一の試験により1からX-1いずれかにすることができ、全体的な結果はラインで、X倍です。
  • 壊れていない最初の直接のx層を破棄するために(卵がこの範囲内にもう中断されませんので)、その後、単に存在していない、我々は、第一層としての第1層のx + 1を入れ、X-1への試み(依然としてわずか1時間、最小の試行回数マイナス1ため)、X-1第一層から上のこの時間は、(層の実数+ X-1はX-で開始)、まだ、それは両方の場合で同じに表示されます。
  • 壊れ目は、xはまた、試行の総数であり、まだ第1層から第2層へのX 2始まります
  • 二度目に壊れていない、または原則の前に、この時間は、x-2層から始まる、というように、最後の層に投げ込ままたは分割されています。

最終的な結果は、(X +(1-X)+(X-2)... + = 100 1 \)\、について解く(X = 14 \)\

トピックアップグレード版

フロアM、卵Nの数は、最小数は、最悪の場合には必要。

ダイナミックプログラミング

上記の仮定法を理解し、その後、動的プログラミングを知った、それはここでの問題ではありません。
次のように状態遷移方程式は:
\ [F [M] [N-] =分(F [M] [N-] ,. 1 + MAX(F [K-1] [N - 1]、F [MK] [N-])。 k \ [1、M-
1])\] 説明:試行の必要な数は、フロアをmときN卵、まだk番目の層の卵ケースでは、2つの場合があります

  • 壊れて、その後、次の必要性だけでしようとK-1層1、N-1個の卵の数は、この時間は、問題が変換されていないフロアの数K-1、卵数n-1、最低最悪の場合回数それ?
  • 壊れていない、最初の-k層が廃棄され、直接に、わずか1メートルの層、卵が壊れていないので、まだnは、この時点では、問題はに変換されていない+ kにしようとする必要があるフロア番号のMK、卵n個の数、最悪の場合に必要な最小数、それ?
  • なぜ、MAXを取りますか?それは最悪のケースであるため、それが最大の場合で壊れ、粉砕かかりませんでした。

コードは以下の通りであります:

int superEggDrop(int egg,int floor){
    int ans[floor+1][egg+1];
    for(int m = 1;m <= floor;m++)
        for(int n = 1;n <= egg;n++)
            ans[m][n] = m;//最坏的情况下,自然是所有楼层试一遍,同时这也是鸡蛋数为1时的答案

    for(int m = 1;m <= floor;m++)
        for(int n = 2;n <= egg;n++)//n必须从2开始,如果是1,就会出现ans[k-1][1-1=0],显然不存在0鸡蛋的情况
            for(int k = 1;k <= m-1;k++)
                ans[m][n] = min(ans[m][n],1+max(ans[k-1][n-1],ans[m-k][n]));
    return ans[floor][egg];
}

おすすめ

転載: www.cnblogs.com/MMMMMMMW/p/12406172.html