問題の意味:を有する環Nデジタル環与えられ、環は必要に隣接し、異なる二つの数は、異なる色(隣接だけ塗布数字など)で塗装しなければなりません。条件を求める場合には色の最小数を必要とし、いずれかの結果を出力します。
アイデア:
最初将来的に自然を見に話題を考えてはならない - 何も状況はちょうどこれらの3つの数字I-1の用語であるため(I-1、I、I + 1)のために、3色の最大を塗装することができます使用するかは重要で、私は、その後の(I + 1、I + 2、I + 3)選択には影響を与えないであろう。あなたはこのような性質を考える場合には、問題解決を開始することは困難です。。。
第容易一つだけ色が塗られている場合、nは同数でなければならない起こります。
ときに使用すると、ときに、2つの色を3色で判断することである難易度はそう。。。明らかにアイデアは、我々だけかどうかを決定するために2つの色を塗装し、隣接する同一のケースに応じて、同じ色を描い、nに火1の考えから別の色の異なる塗装、nは1と後と仮定することができるということです競合。
もちろん、このアイデアは、入力N明らか= 4 {1,2,2,3} 1と最後の3が衝突である場合には、間違っています。トピックは隣接しており、隣接して連続した同じ番号が、我々は、上記の紛争、この連続と同じ配列の場合は、最後の1の後にすることができます表示されたときに同じ数字がそう、同じ色を塗らなければならないので、何のルールはありませんこの時はまだ確立されていない場合はデジタルでは、逆に、我々は最後の数字が3に設定されているだけに、3色を必要としています。
1の#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 4 int型、T、N、SB、最後。 5 INTアウト[ 2000005 ]。 6 7 INT メイン(){ 8 のscanf(" %dの"、&T)。 9 一方(t-- ){ 10 、INTフラグ= 0、K = 1 。 11 のscanf(" %D%D "、&N、&最後)。 12 int型の一つ= 最後。 13 OUT [ 0 ] = 1 ; 14 のために(INT iは= 1 ; I <N I ++ ){ 15 のscanf(" %dの"、およびSB)。 16 であれば(最後== SB)を[I] = OUT [I - 1 ]、フラグ= I。 17 他 OUT [I] = 3 - OUT [I - 1 ]、K = 2 。 18 最後=はSB。 19 } 20 であれば(OUT [N - 1 ] == 1&&最後=つ&& K ==!2 ){ 21 であれば(フラグ=!0)のための(INT iはフラグ=、I <N; I ++)を[I] = 3 - OUT [I - 1 ]。 22 他 K = 3、OUT [N - 1 ] = 3 ; 23 } 24 のprintf(" %dの\ N " 、K)。 25 のために(INT iは= 0のprintf(; I <N I ++)" %のD " 、OUT [I])。 26の プット(""); 27 } 28 リターン 0 。 29 }