ミサイル迎撃システムを開発するために、敵のミサイル攻撃を防御するために国。
任意の高さに到達するための最初のラウンドですが、しかし、各シェルと状況は高さを持って前よりも大きくすべきではない。しかし、そのようなミサイル迎撃システムは欠陥を持っています。
ある日、レーダーは、入ってくる敵のミサイルを拾いました。
システムとして、ベータまだそう唯一のシステムであるため、すべてのミサイルを迎撃しないことができます。
高さを飛ぶミサイルターン(与えられたレーダデータの高30,000より大きい正の整数ではありませんが、ミサイルの数が1000を超えていない)、傍受するミサイルの最大数を計算し、システムを入力して、あなたがこのセットの最小数を装備するために、すべてのミサイルを迎撃する場合ミサイル迎撃の一種。
入力形式
合計行、ミサイルターン浮上量を入力してください。
出力フォーマット
最初の行は、インターセプトするまでミサイルの数を表す整数を含んでいます。
2行目は、最小装備するすべてのミサイルを迎撃するシステムの数を表す整数を含んでいます。
サンプル入力:
389 207 155 300 299 170 158 65
出力例:
6 2
分析:
質問の意味のこの質問はあなたがミサイルを見つけるまで、単調に最初のパス場合、最長の長さを短くして、仕上げを探し、その後、内部への高さからのミサイルの残りの部分はで探して高さが全て厳密に単調減少を見つけることですし、統計の数を見つけることは
、その後、別の人を述べると--->どのように多くの単調減少列で上書き完全な配列
貪欲プロセス:
各番号をスキャン前後からを:
ケース1:既存のサブシーケンスは、現在よりも小さい場合番号、新しいサブシーケンスの作成
ケース2:そのほとんどの子供のシーケンスの背面にある現在の数より等しいか大きいです
G []配列は、彼が単調に増加することを確認するために、私たちのシーケンス番号の末尾に相当し、我々は、xの最小値に等しいより大きい現在のサブシーケンスの終了、すなわち、xは配列の末端により大きいすなわち後端xに等しいプロモーター配列の後ろに、
この質問は、既知の抗チェーンがある場合のうちferretingあるDailWorth定理、私は詳細には触れない場所、次を理解することができます興味を持っています。
ここでは、比較入力は、cを参照することができ、特定にstringstream ++
詳細な特定のコード:
1の#include <iostreamの> 2の#include <アルゴリズム> 3 4 使用して 名前空間STD。 5 のconst int型 N = 1010 。 6 INT N。 7 INTのQ [N]。 8 INT [N] F、G [N]。 9 10 INT メイン(){ 11 ながら(CIN >> Q [N])N ++ 。 12の INTは RES = 0 。 13 のために(int型 I = 0 ; iがN <I ++は{) 14 F [I] = 1; 15 用(INT J = 0 ; J <I、J ++ ) 16 IF(Q [J]> = Q [I])F [I] = MAX(F [I]、F [J] + 1 ) 。17 = RES MAX(RES、F [I]); 18である } 19の。 COUTのRES << << ENDL、 20は 21である // G []配列格納して、すべての我々の現在の既存シーケンス 22 // 我々の現在のCNTで表されます既存のサブシーケンスの数 23である INT CNT = 0 ; 24 // フロント再びピギーバック 25 のために(INT I = 0 I ++は; I <N- {) 26であります int型 K = 0 ; // Kは、私たちは前から後ろに見つけシーケンスを表す 27 //は、我々はすべてのシーケンスをトラバース終了し、現在のシーケンス番号の末尾が、私たちの現在よりも小さくなっているされていない限り、それはK ++ 28を しばらく(K <CNT && G [ K <Q [i])とK ++; // 配列と完全な配列は、配列の最小値より小さくないが見つける私たち++ 29 G [K] = Q [I]; // 大Q [i]の交換を小さな決意のシーケンスで元の位置に行わ 30を IF(Kは> = CNT)// 説明我々は現在の数のいずれよりも大きいシーケンス持たない 31 // 我々が新しいシーケンス開きます 32 CNTを++ ; 33である } 34であります 35 COUT << CNT; 36 37 }