CF 1173C Nauuoとカード

トピックリンク

効果の対象に

2 * Nカードの総数、N張0、N N枚1。今、あなたの手でランダムなn枚(0デジタル)は、その後、他のn個のデッキ張、カードやカードのデッキの現在知られている手は、以下の何倍にもすることができますカードの手の中に任意の場所デッキの一番下に、カードの手にトップデッキ。トップデッキにデッキを可能にし、最小回数の終了後に尋ねたn個のカードは、1,2,3 ... nです。

考え

(シートと数字の数の数は0からnであるため、そのすべての番号が変わったからあなたは0を使用することができることを確認し、)すべての数字が手にするまで、まず第一に、最終状態を完了させるために、あなたは常に、0を置くことができ、その後、デッキに変身。

場所の数を減らすことができる2つがあります。

  • 一部のカードは、カードの山に直接することができ、もはや手の中には落ちません。(例えば、オリジナルタイトルの最初の例では、スタック内のすべての動作中のカードです。)
  • すべてのカードを手にデッキを開始し、順番に入れてまで、つまり、必ずしもすべてではない私はゼロでスワップアウトされ、待ってはいけません。

一つ目は、私はおそらく私が直接行って置くことができるかどうかを確認し、特別の話をするために何か良い方法を考えていませんでした。

第二に、スタックに置かれたカードの最終順位は0、···、0,1,2、...、nは、どのように多くの0を検討することが重要であることが必要です。各コンバータカードが手に数値0を算出する用紙Pの数を必要としたであろう[i]は、0 I-1番目の数になることができる最大れたので、私は放電回数の開始時に、それの最小値を必要とするように滑らかにしますP [i]は-i + 1 0張をしましょう。だから、0を見つけるためには我慢し、プラスnは好きです。

 

1つの#include <ビット/ STDC ++ H>
 2  
3  使用して 名前空間STDを、
4  
5  int型の寿[ 200005 ]、DUI [ 1000006 ]、HD、TL、ANS、P [ 200005 ]、N、inshou [ 200005 ]。
6  
7  ブールpaixu()
 8  {
 9      ブール RET = 1 10      のためにint型 i = 1 ; iが<= N; iが++ 11      {
 12の         場合(I = DUI [iがHDを+]!)RET = 0 13      }
 14     リターンRET;
15  }
 16  
17  空隙workp()
 18  {
 19      のためにint型 i = 1 ; iがn = <; iは++ 20      {
 21          P [寿[I] = 0 ;
22      }
 23      のためのint型 i = 1 ; iがn = <; iは++ 24      {
 25          P [DUI [I] = I。
26      }
 27      リターン28  }
 29  
30  INT (主に)
31  {
 32      のscanf(" %d個"、&N)
33      のためには、int型 I = 1は iが++; iがn = < 34      {
 35          (scanfの" %dを"&、寿[I])。
36          inshou [寿[I]] ++ ;
37      }
 38      のためのint型 i = 1 ; iが<= N; iが++ 39      {
 40          のscanf(" %dの"、&DUI [I])。
41      }
42は、      HD = 0 TL =; ; N-
 さ43      ながら(inshou [DUI [TL] + 1 ])
 44である     {
 45          ++ ANS ;
 46である          TL ++ ;
 47          DUI [TL]はDUI [TL- = 1 ] +を1 ;
 48          inshou [DUI [ TL]] - ;
 49          HD ++ ;
 50          inshou [DUI [HD]] ++ ;
 51である     }
 52が     IF (paixu())
 53である     {
 54である          のprintf(" %d個の\ N- " 、ANS)。
55          リターン 0 ;
56      }
 57      他の
58      {
 59の          ANS = 0 60          workp()。
61          のためには、int型 i = 1 ; iが++; iが<= N 62          {
 63の              ANS = MAX(ANS、P [I] -i + 1 )。
64          }
 65の          ANS + = N。
66      }
 67      のprintf(" %Dを\ n " 、ANS)。
68      リターン 0 ;
69 }

 

おすすめ

転載: www.cnblogs.com/LiqgNonqfu/p/10990238.html