効果の対象に
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 }