タイトル:テスト回
住民気性のX惑星は非常に良いではありませんが、幸い彼らは異常な行動がある場合にのみ、怒る:携帯電話を投げます。
大手メーカーも飛散防止電話の多様性を導入しています。品質監督のX惑星局は、それが取引許可する前堅牢電話がテストされ、飛散防止指数によって評価されなければならい。
X惑星はちょうど耐久性試験のために使用することができ、多くのそびえ立つ塔があります。彼らは地面の最初の層が、私たちの二階の等価ではありません、塔の各層の高さは同じであり、地球は少し異なります。
電話が破産しなかった場合は、レイヤ7が低下したが、8階には、携帯電話の耐久性指数= 7を破ったから。
特に、携帯電話は、第1層1からドロップされた場合に破壊意見、= 0凹凸指標です。
n層の上に塔が壊れた、耐久性指数= N投げていなかった場合は
テストの数、テストを取るための3つの携帯電話メーカーのそれぞれからサンプルを減らすために。
私たちは、常に最善の戦略を使用する場合は1000年レベルのテストのタワー高は、ほとんどの必要性はどのように多くの時間を決定するために、最悪の運で試験する携帯電話の耐久性指数それ?
テストの最大数を記入してください。
注:あなたが入力する必要が整数である、余分なコンテンツを記入しないでください。
回答:19
アイデアに問題解決:この問題は、多くの人が二分法を見つけることと思うだろう最初の反応を確認することですlog21000 = 10なら、答えは非常に簡単になります。
1.しかし、問題は500層で初めて二分法がバラバラに落ちていなかった場合、携帯電話の耐久性指数をテストすることである次の層250が破壊されない場合、次の層125が壊れている、私たちの携帯電話のことどのくらいの耐久性の指標であり、明らかに私たちが知ることができない、飛散防止指数二分法携帯電話の使用ので、あなたは最悪の場合には耐久性の指標を測定するための10の携帯電話を必要とします。
2.したがって、トピックの正確なアイデアは、動的計画法を使用しなければなりません
。リストグリッド
(コンテンツ内の空白被写体が時に携帯電話の使用は、ちょうど私のJの床が求めているされ、最悪の運のための最善の戦略の下で電話番号を投げます)
B。1.フィルデータ(我々は唯一の携帯電話の時間があるとき)
//只有一个手机时,几层楼就要摔几次
for(int i=1;i<=N;i++) {
dp[i][1]=i;
}
2.私たちは2と3の電話番号を持っています
トピックは与える:テストの数、テストを取るための3つの携帯電話メーカーのそれぞれからサンプルを減少させるために。この通路はそれを理解するためにどのようにする必要があり
、我々は一つの層に該当する場合にのみ携帯電話など、層1000は、最悪の場合には、1000年を必要とする場合
- 1.私たちは3階建ての建物に2台の携帯電話を持っているとき、我々はテストの経験の数を減らすことができるようになります
- 2.私たちは2階から落ちた携帯電話を入れると、2例があるがどちらか壊れて壊れたりしていません。
このとき、インデックスを投げるだけたら、次に凹凸を得ることができる。(1階が壊れ床2の場合は、一度に落下する
1は層2に破壊されない、壊れた凹凸指数が0を表しますケースは、()と同じようにバラバラに落ちなかったの構築、我々は3つのモバイル電話のケースを持っているとき、共感の3階) - この時点で、私たちは、3階建ての携帯電話のケースを考慮することができる、と落とし、それが壊れているので、この時点で我々は、2階建てに行くことができない、我々
- 私たちは、彼の耐久性指数を知ることができず、今回は素直にのみ一階から降りて投げるようになったことができます。
具体的な表形式のデータ
Cは、法律をまとめました。:
DP [I] [J]:jは、テストケースから落下する電話Iのフロアを表し
、我々は、各空の最大値を決定することができるので、携帯電話2、Fを見つける例えば:(床前+1回3二階で周波数が再びシークするとき、すなわちDP [I-1] [j)が3の特定の数が得られる構築3床に落ち ] +1
:二つの状況の最小
ダメージ:DP [K-1]:合計がk-1、モバイル-1の数層にしようとし続けて [J-1]
損傷していない:コNK層、同じ電話番号に試みを続ける:DPを[NK ] [J]
最小数により要求最悪の運に、すなわち2例、上方から生成される:MAX(ダメージの数、症例数が損傷されていません)
そして、一度両方試し層におけるK MAX(+1ダメージ回、損傷なし回数+1)
即:MAX(DP [K-1] [J-1] + 1、DP [NK] [J] +1)=> MAX(DP [K-1] [J-1]、DP [NK] [J ])+ 1
MAX(DP [K-1] [J-1]、DP [NK] [J])+ 1 <= DP [I] [J] <= DP [I-1]〜[J] +1
そうする各ブランクの最大値は、それに依存するかを決定するために、私たちを充填する工程は、(特定の優先ケースを埋めるために電話回線の数に応じているので、最終的に、結果DP [1000] [3]があり、床は、変化します空(同じ電話番号、床-1))の前で同じことを達成するためのコードは、(外側のループ内の電話番号)が真であるよう:(注:私たちの戦略は最適な、でも運が悪い、悪い、唯一のオプションでなければなりません、私たちはすなわちその1現在の最良の選択肢を決定する必要があるので、それは、私たちが利用可能なオプションから選択し、最適なソリューション、ソリューションのすなわち少なくとも数には影響しません:分())
特定のコード:
package 蓝桥杯_2018;
import java.util.Scanner;
/**
* 题目理解:
* 在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?
* 1.这里的测试多少次是指需要摔多少次手机
* 2.个人一开始疑惑的点是为了减少测试次数,从每个厂家抽样3部手机参加测试
* (个人理解的偏差以为一次测试可以扔3部手机),1次测试还是只能扔1部手机
* 其实题目增加手机数是为了尽量少摔几次手机
* 1 2 3 4 5 6 ....1000
* 1 1 2 3 4 5 6 1000 dp[i][j]:表示i层楼时使用j部手机需要摔的最大次数
* 2 1 2 2
* 3
* 例如只有一部手机的时候我们只能一层一层的摔,1000层的话最坏情况需要1000次
* 1.当我们有两部手机时在有3层楼的情况下我们就能体会到减少测试次数
* 2.当我们把一部手机从2层摔下时,有两种情况要么碎了,要么没碎。
* 此时只需再摔一次就可以得到耐摔指数了.(在2层楼碎了的情况下往1层楼摔一次,
* 碎了则代表指数是0,没坏就是1。在2层楼摔下去没碎的情况同理)
* 此时我们可以考虑只有一个手机3层楼的情况,我们此时并不能往2层楼扔下去, 因为它碎了,我们
* 就无法得知他的耐摔指数了,此时我们只能乖乖的从1层开始往下扔.
*/
public class 测试次数 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int N=s.nextInt(); //表示楼层数
int M=s.nextInt(); //表示手机数
//dp[i][j]:表示i层楼时使用j部手机需要摔的最大次数
int dp[][]=new int[N+1][M+1];
//只有一个手机时,几层楼就要摔几次
for(int i=1;i<=N;i++) {
dp[i][1]=i;
}
//两个以及以上手机时(j代表剩余手机数,i代表剩余楼层数)
for(int j=2;j<=M;j++) {
for(int i=1;i<=N;i++) {
//赋最大初值(楼层每增加一层,其需要摔的次数一定会小于等于其楼层数减一的次数+1)
dp[i][j]=dp[i-1][j]+1;
for(int k=2;k<i;k++) {
//dp[k-1][j-1]表示在第k层摔坏了
//dp[i-k][j]表示第k层没摔坏
dp[i][j]=Math.min(dp[i][j],
Math.max(dp[k-1][j-1], dp[i-k][j])+1);
}
}
}
//输出表格右下角的值
System.out.println(dp[N][M]);
s.close();
}
}