コード軍1173C题Nauuoとカード

元の質問へのリンク: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 }

 

おすすめ

転載: www.cnblogs.com/blowhail/p/10990833.html