OCAC夏のセカンドゲームシーケンスキュー問題の説明M

シーケンスキュー
[タイトル]説明
キューを持っている今、あなたを教え、それは、あなたが1,2,3よまず最初に、...キューにターンプッシュ中のmメートルこの番号は空でスタート。
次に、操作は次の手順を必要とする各操作、N回実行されます:
まず、キュー要素の頭部、最初のチームの出力素子、キューの先頭とキュー要素が飛び出し、あなたがして、必要に応じて、以下の2つの選択可能アクション:
1.このチームの最初の要素は放棄することはありません。
最後にチームに再加入するキュー要素の2頭。
今、あなたのチームの最初の要素nと操作のn回出力を伝え、あなたはこの操作が可能であることを数mなどがあるかどうかを判断する必要があります。
[入力形式
の正の整数nの最初の行の、表現するための操作の数。(1≤n≤100000)
スペースで区切らnは正の整数の第2行は、最初のチームのためのn番目の要素の出力動作を表します。
[出力形式]
n倍は、出力「YES」実現可能な動作をm個ような数が存在する場合、それ以外の場合、出力は「NO」。
サンプル入力[1]
。5
1 2 2 1 3
[サンプル1]出力
YES
[サンプル2]入力
。5
1 2 2 1 3
[サンプル2]出力
NO
[説明]サンプル
試料1について、およびm ==図3は、我々は、標的配列を得るために、次の手順を実行することができる[1,2,3,2,1]
最初に、QUE = [1,2,3]
STEP.1:出力1 = que.front()、que.pop( )、que.push(1)、今回= QUE [2,3,1]
STEP.2:出力2 = que.front()、 que.pop()、que.push(2) 、この時間= QUE [3,1,2]
STEP.3:出力3 = que.front()、que.pop( )、que.push(3)、この時= QUE [1,2,3]
STEP.4:出力1 = que.front()、que.pop( )、この時間= QUE [2,3]
step.5:出力2 = que.fornt( )、que.pop()、QUE = [3]今回
、我々の出力シーケンスは、[1,2,3,1,2]、m個の== 3が存在するように。この一連の合法的な、我々の出力「YES」。
サンプル2については、我々はメートルを取得する方法がありません。
我々の出力は、私は、1を放棄し始めたことを1、2、3 2、およびm == 3の後に、この出力はI 2が正当なものである、ので
、私の後に2と1の出力が、 1が放棄される前に、アナログは、ここで我々は明らかに確かに見ることができます。だからではなく、法的シーケンス、出力「NO」を行います。
[分析の問題は
この質問には、シミュレーションキューについての質問です。
シミュレーションタイトルそれは、それは物事のクラスのシミュレーションです。
それはエレベーターのシミュレーションの質問であれば、我々は最初のエレベーターの原理を理解する必要があり、我々はシミュレーションの質問が便利開始します。
それのシミュレーションタイトルキューの後、我々はまた、キューの動作を理解して、法律に行きたいです。
まず、私たちは言葉の正当なシーケンスは、それが最初のm個のデータは確かに1,2,3、...、Mであるだから、mは、見て非常に良好であることがわかります。
このプロパティが満たされていないのであれば、その後のシーケンスは正当ではありません。
私たちはメートルを見つけることが、その後のシーケンス要素がmよりも大きいが存在する場合や、それが正当ではありません。
その後、我々は、n番目の要素へのM + 1のシーケンスを見始める、
彼らが増加した連続した配列の数に分解することができ、そしてこれらの配列の1のフロントが含まれていない場合、それは法的ではありません。
例えば、配列次のように:
1、2、3、4、5、2、3、5、3、4は、
最初の5つの要素によれば、我々はm個の== 5を決定することができ
、その後、我々は5要素のシーケンスを開始しますいくつかの連続する立ち上がりシーケンスに分割し、その後、系列グループ(第5要素)を分割した後、次のように
    [1、2、3、4、5]
    [2、3、5]
    [3、4]
第一に係ります第2のサブシーケンスは、まずホイール4及び雑草アウト1を決定することができ、
その存在は正当ではないので、その後、4つあり、前記我々は、第三のサブシーケンスに行くが、最初の4が除去されました。出力"NO"。
次のようにコードは次のとおりです。

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
const int型MAXN = 100010; 
N INT、[MAXN]、M。
BOOL [MAXN]切断; 

ボイドget_m(){ 
    M = -1。
    もし(![1] = 1)のリターン; 
    以下のために(INT I = 2; iが<= N; iは++){ 
        IF([I]> [I-1] + 1)に戻り、
        IF([I] <= A [I-1]){M = A [I-1]; 返します。} 
    } 
    、M = N。
} 

int型のmain(){ 
    CIN >> N。
    以下のために(INT i = 1; iが= <N; iは++)CIN >> [I]。
    get_m(); //得到のM 
    (M == -1){もし
        プット( "NO")。
        0を返します。
    } 
    <; {//判断有没有数大于M;(iはN ++ =ためiは、M + 1 = INT)
        IF([I]>
            プット( "NO");  
            ながら(!que1.empty()&& que1.front()= [I])que1.pop();
            0を返します。
        } 
    } 
    キュー<整数> QUE1、que2。
    que1.push(i)について(; I <= M I ++はI = 1 INT)と、
    (I = M + 1 int型、iが<= N; iが++){ため
        、一方(que1.empty()&& que1.front()= [I]!)que1.pop(); 
        (!que1.empty()&& que1.front()== [I])であれば{ 
            que2.push(que1.front())。
            que1.pop(); 
        } 
        他{ 
            ながら(!que2.empty()){ 
                que1.push(que2.front())。
                que2.pop(); 
            } 
            IF(!que1.empty()&& que1.frontは()== [I]){ 
                que2.push(que1.front())。
                que1.pop();
            } 
            他{ 
                プット( "NO")。
                0を返します。
            } 
        } 
    } 
    プット( "YES")。
    0を返します。
}

 

おすすめ

転載: www.cnblogs.com/ocac/p/11131692.html