タイトル説明
Tom
問題の興味深い一種の最近の研究。示されるように、2つのスタックS1とS2、Tom
望んでは、入力シーケンスの昇順で次の4つの操作を達成します。
オペレーティング
入力シーケンスが空でない場合、最初の要素は、スタックS1にプッシュ
操作b
スタックが空S1でない場合は、S1は、先頭の要素をポップするために、出力シーケンスであります
操作C
入力シーケンスが空でない場合、最初の要素は、スタックS2にプッシュ
操作D
スタックは空S2、先頭の要素をポップするS2の出力シーケンスではない場合
1-N Pが配置されている場合、出力シーケンス1,2、...、(N-1による一連の動作をするように )、 Tom
それが呼び出されたP「ソーティング装置は、デュアルスタックであってもよいです。」(1,3,2,4-)であるような、および「照合順序は、デュアルスタックとすることができる」(2,3,4,1)ではありません。次の図は、一連の操作(1,3,2,4-)ソーティング説明:<、C、C、 B、D、D、B>
もちろん、このような動作は、ケース(1,3,2,4-)のために、いくつかの配列であり得る、<、C 、C、B、D、Dは、B> の動作の別の可能な配列です。Tom
私はイエスの操作の辞書式順序の中で最小であるかを知りたいです。
入力形式
最初の行は、整数であるN。
第二行は有して形成するn個のスペースで区切られた正の整数1-Nが配置されています。
出力フォーマット
合計行は、入力装置がない場合には、デジタル出力「構成をソートするデュアルスタックとすることができる」0 、そうでない場合、出力は、辞書式最小動作シーケンス、二つの操作の間の空間によって分離された各々 、スペースなしで行の末尾。
サンプル入力と出力
4 1 3 2 4
abaabbab
4 1 2 3 4
0
3 2 3 1
acabbd
説明/ヒント
データ満足の30%:n≤10
データ会うの50%:n≤50
100%のデータを満たす:n≤1000
考え
シンプルな再帰アルゴリズム。
実際には、このトピックは検索する必要はありません、二部グラフを必要としません。
限り、私たちは自然を満たすために必要な要素を並べ替えることができるかどうか考えとして、あなたはスタックに欲を追加することができます。
コード
#include <cmath> の#include <cstdioを> する#include <CStringの> する#include <iostreamの> する#include <アルゴリズム> 名前空間STDを使用して、 const int型N = 1010; CHAR ANS [2 * N]。 [N]、[N]、B [N]のint。 int型広告、BD、K、N、CNT、ASD; ブールチェック(int型のk){ (!BD)の場合 、戻り1; int型I、J。 <;(私は++ = n iはi = K + 1)のための ([K]で&& [I]> [BD] B中に[i])とする場合> ブレーク。 (; J <= N J ++ J = I + 1)のための ([K]で[J] <において)場合に falseを返します。 trueを返します。 } int型のmain(){ できるBOOL = 1。 = 1でのint; scanf関数( "%のD"、&N); ; [0]、B [0] = 1E4、ASD = 1 = I = 1をint型(ため。I <= N。I ++) scanf関数( "%のD"、および[I]において)。 以下のために(INT i = 1; iが<=(N << 1); iは++){ IF([AD] == ASD){ ad--。 ASD ++; ANS [++ CNT] = 'B'。 持続する; } IF(B [BD] == ASD){ bd--。 ASD ++; ANS [++ CNT] = 'D'。 持続する; } であれば(AT <= N &&に[で] <[AD] &&()のチェック){ [++広告] = [で]で、 ANS [++ CNT] = 'A'; ++で、 持続する; } であれば(AT <= N &&で【で<B [BD]){ [++ BD] Bに= [で]。 ANS [++ CNT] = 'C'。 ++で、 持続する; } 0 =できます。 ブレーク; } IF(可能)putchar(」「); 他 putchar(ANS [i])と、のputchar(」「)。 printf( "0"); printf( "\ n")を。 0を返します。 }