テスト数(ブルーブリッジカップ)

序文

質問をブラッシングしているときに、そのようなトピックに出くわしました。一見、それは非常に単純でした。それほど単純であるとは思っていませんでした
。ごめんなさい!

トピック

タイトル:惑星Xのテスト時間の住民はあまり気さくではありませんが、幸いなことに、彼らが怒っているときの唯一の異常な行動は、携帯電話を落とすことです。大手メーカーもさまざまな落下防止携帯電話を発売しています。惑星Xの品質監督局は、携帯電話が流通のためにリストされることを許可される前に、落下試験に合格し、落下抵抗指数を評価されなければならないと規定しています。
惑星Xには、落下試験にぴったりのそびえ立つ塔がたくさんあります。タワーの各フロアは同じ高さですが、地球上ではわずかに異なります。1階は地面ではありませんが、2階に相当します。
電話機が破損せずに第7層からドロップされたが、第8層が破損した場合、電話機の落下抵抗指数=7です。特に、第1層からドロップしたときに電話機が破損した場合、ドロップ抵抗インデックス=0になります。
タワー最上階のn階が破損していない場合、落下抵抗指数= nテスト回数を減らすために、各メーカーから3台の携帯電話をサンプリングしてテストに参加します。
あるテストでは、タワーの高さは1000層ですが、常に最善の戦略を採用する場合、最悪の運の下で携帯電話の落下抵抗指数を決定するのに何回かかりますか?この最大数のテストを記入してください。
注:入力する必要があるのは整数です。冗長なコンテンツは入力しないでください。

カードポイント

この質問はどうすればいいですか?最初は、2019年のグループBのJAVAブルーブリッジカップのタイトルであり、4番目の質問なので、タイトルをよく読んで、しばらく考えて書いたそれ、そして答えが間違っていたことがわかりました。調べてみると、久しぶりに他の人がどうやって思いついたのかわからなかったので、ついに自分でタイプしてタイプアウトしました。

当時、なぜこの質問に答えなかったのか、間違っていたのですが、主な理由は、言語の理解が比較的悪く、彼の称号の意味を常に理解していたからです。
また、ここで繰り返します。つまり、電話をドロップして、電話のドロップ防止値をテストするように依頼します。最初のレイヤーが壊れていない場合、値は少なくとも1であり、2番目のレイヤーは壊れていません。壊れてから+1し、電話が壊れるまで、落下抵抗値をテストします。ここで、携帯電話が3台あるとします。運が悪ければ、結果を得るために3台の携帯電話を何回落としたかを尋ねます。

この質問のもっと嫌なことは、電話がどのように落ちたのかを考えるのが難しいということです。彼がどのように落ちたのかを知っていれば、実際に直接かつ迅速にアイデアを思いつくことができます。私もここで立ち往生していて、理解できません。これがどのように起こったのかスロー、そして最悪の運。

ただし、ここでのdpに関するヒントは非常に明白です。1つは「ほとんど」という単語であり、タイトルは、dp、レイヤーの数、および携帯電話の数に影響を与える要因を直接伝えることに相当します。したがって、このdpは非常によく考えられます。まず、値は当然私たちが求めるものであり、次にdp [i] [j]です。ここで、iは床を表し、jは携帯電話を表します。もちろん、その逆も可能ですが、私はその方法が好きです。

メーター別

このとき、この電話がどのように落ちたかを考えてみましょう。この作品、まずはテーブルを作ってみましょう
ここに画像の説明を挿入
。これが最初のポイントで、簡単に思い浮かびます。

次は携帯電話を2台持っている場合です。

1階しかない場合は2台の携帯電話も1回落とします。2階の場合は2階に直接落とすことができます。壊れている場合は1階に行ってテストします。壊れていないので、直接テストします。それなら、1回だけ必要です。つまり、1階から2階まで測定を続けました。彼が最大のものを望むなら、私もこの時に彼に2を与え
ここに画像の説明を挿入
ます。2つの携帯電話がある場合、3、4、および5つのフロアがあります。3階ならもちろん1階に直接落として1回は壊れますが2回目は壊れず電話が残ってしまうので落とせません現時点では2階から直接、1からしか開始できません。つまり、携帯電話で最大2層を測定するのにかかる時間です。明らかに、現時点では2であり、前の層を追加します。だから3

したがって、2つの携帯電話に4つの層がある場合、4番目の層から直接それらを失い続けると、私たちの仮定によれば、最悪の事態はおそらく4倍であり、3番目の層からそれらを失い始めるとどうなりますか。

したがって、ここでは、2台の携帯電話の表を要約し、それらを異なるフロアから投げて、最良の時間と最悪の時間を測定することができます。
その中で、good、brokenは、現在のレイヤーが壊れているかどうかを示します
ここに画像の説明を挿入

ですから、現時点では、最も戦略的で最悪の運を追いかけると、最上階から直接投げ始めることはできませんが、常識的には、高所から直接投げる方が良いことがわかりました。 1階から直接ですが、直接主観的にすることはできないので、現時点では適切な戦略を選択する必要があります。

問題の変換

したがって、現時点では、この問題で対処する2つのポイントがあると判断しました。1つはdpを決定することであり、もう1つは最初のレイヤーの開始である戦略を決定することです。

次に、ここでの質問は、明らかに、最良の戦略の下で何回費やす必要があるか、つまり、下の表
で最も多く、最も少ないかを尋ねることです。次に、各レイヤーの大部分は、現在のレイヤーで電話が壊れているかどうかによって決まります。壊れていない場合
、dp [ni] [j] iは層の数、iは携帯電話の数です。それが壊れている場合、それは1 + dp [i-1] [j-1]であり、次に最良の戦略を決定し、対応する「ほとんど」を記入すれば大丈夫です

ここに画像の説明を挿入

コーディング

これを言うのは少し紛らわしいかもしれませんが、次にコードを見ると直接理解できます。

public class 测试次数 {
    
    
    static int N = 1000;
    static int M = 3;
    static int[][] dp = new int[N+1][M+1];
    public static void main(String[] args) {
    
    
        //初始化,第一台手机
        for (int i=1;i<N;i++){
    
    
            dp[i][1] = i;
        }

        //中间状态
        for (int i=2;i<=3;i++){
    
    
            for (int j=1;j<=1000;j++){
    
    
                //选择出最好的方案
                int min_val = Integer.MAX_VALUE;
                for(int k=1;k<=j;k++){
    
    
                    int max = Math.max(1 + dp[j - k][i], (dp[k - 1][i - 1])+1);
                    min_val = Math.min(max, min_val);
                }
                dp[j][i] = min_val;
            }
        }

        System.out.println(dp[N][M]);
    }
}

要約する

この質問の興味深い部分は、携帯電話をどのように落とすかということです。実際、中間プロセスを理解するのは非常に簡単です。ここも面白いところです。

おすすめ

転載: blog.csdn.net/FUTEROX/article/details/123669007