元の質問へのリンク:http://codeforces.com/contest/1173/problem/C
タイトル効果:カードは、nは1〜Nの番号が付け式中、nは0またN手をプレイしている、2N有し、nはテーブルの上に置くシート、各動作がほとんど、テーブル上のカードの下に配置することができます上記は操作の最小数を聞いて、カードを取りました。
考え:、カード1の位置を確認し、カード1がテーブル上にある、端部に満足インクリメントかどうかを確認するために、例えば、001234。それが連続してカードを挿入を満たしている場合、カードを取り外します。
1後、それを順次カードに挿入された手の中にあれば、1から出発して、カードを取り外し、1が挿入され、この場合のカード2がテーブルカードグループに残っている場合、操作+1の数は、まずカードを決定するために継続削除2カード。(これは、手2に、2の後に挿入物を得るために待たなければならないれていない場合、カード0に挿入されたカードの前に1つの対応、即ち、カード1の数は遅延挿入されています)
コードは以下の通りであります:
1の#include <cstdioを> 2の#include <iostreamの> 3の#include <アルゴリズム> 4の#include < ストリング > 5の#include <CStringの> 6の#include <cmath> 7 の#define LL長い長 8 使用 名前空間STD。 9 INT [ 200005 ]、B [ 200005 ]、C [ 200005 ]。 10 のint main()の 11 { 12 INT I、T、M、N、U、和= 0、MAXS、分、X、Yは、= 0 、Zを; 13 のscanf(" %のD "、およびN-); 14 のための(I = 1 ; I <= N; ++ I){ 15 scanfの(" %のD "、&T); 16 A [T] ++ ; 17 C [T ] ++ ; //、Cアレイ手記録カード 18である } 19。 ための(I = 1 ; Iは<= N-; ++ I)が 20である scanfの(" %のD "、&B [I]); 21である INT J、K; 22は、 IF([ 1 ] == 0 )// 1が手を判断されていません 23は、 { 24 のための(I = 1 ; I <= N ++ I) 25 IF(B [I] == 1 ) 26は 、{ 27 = K 1 ; Jは= 1 ; 28 つつ。(J)表1 //デッキに、それが最後の背面に昇順か否かが判定された場合に 29 { 30 のiF(I == N-) 31である { 32 BREAK ; 33である } 34である 他の 35 { 36 I ++は、 37 [ K ++ ; 38である IF(!B [I] = K) 39 { 40 = J 0 ; 41れる } 42れる } 43である } 44は、 IF(!J) 45 BREAK ; 46である } 47 } 48 K = 0 ; 49 IF (J)/最後にカードから昇順である場合/、カードを追加するために、今後も継続するか否かを判断する 50 { 51が X = Bは[N-] + 1 ; 52である IF(X- 1。 == N-)を正確に満たしている場合//カードテーブルがインクリメントされる1-N置く 53は K = 1。; 54れている ため(I = 1 ; I <= N; ++ I)は{ 55 IF(C [ X] == 1 ) 56である SUM ++ ; 57である 他{ 58 BREAK ; 59 } 60 [I B] C ++ ; //一番カード取り外し 61である 62ことである IF(X> = N-)//完全に滑らか排出部カード 63であり、 K = 1。; 64 X ++ ; 65 } 66 } 67を IF (K){ 68 のprintf(" %d個の\ N- " 、SUM); 69 リターン 0 ; 70 } 71である の手にカード場合// 72 SUM = 0 ; 73である 整数 P = 1 ; 74 のために( = I 1 ;; ++ I) 75 { 76 IF([P] == 1 )// Pカードに、この時点でカードPは、オペランド+1存在しない場合、むしろ(最前カードを削除0カードの前面に)カードを挿入する1。 77 P ++を、 78 79 [B [I]] ++ ; //一番カード取り外し 80 SUMを++ ; //操作の回数記録 81を IF(P + N - == 1 ) 82 BREAK ; 83 } 84 のprintf(" %d個の\ N- " 、SUM ); 85 86 リターン 0 ; 87 }