【题意】
给定n个数的围成一个环,如果相邻的位置,不同的数字必须涂不同的颜色。问最少使用多少种颜色
【题解】
根据三色定理,答案肯定是小于等于3。
1、如果只出现一种颜色,那么答案肯定是全1。
2、如果是偶数,肯定是1,2,1,2。
3、如果是奇数,同时存在一个位置连续相同,那么答案就是1,2,1,2……1)(1,2,1,2……
因为通过连续为同一个数,可以人为分割两组,且肯定满足。
其余情况就是1,2,1,2,……3
【具体代码】
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<algorithm> 5 #include<iostream> 6 using namespace std; 7 typedef long long ll ; 8 const ll mod = 998244353 ; 9 const int N = 2e6 + 10; 10 int a[N],n; 11 int main() 12 { 13 int T ; 14 scanf("%d",&T); 15 while( T -- ){ 16 scanf("%d",&n); 17 18 bool One = true ; 19 bool Two = false ; 20 int Pos = -1 ; 21 for( int i = 0 ; i < n ; i++ ){ 22 scanf("%d",&a[i]); 23 if( i>0 && a[i-1] != a[i] ) One = false ; 24 } 25 for( int i = 0 ; i < n ; i++ ){ 26 if( a[(i-1+n)%n] == a[i] ){ 27 Pos = i ; 28 Two = true ; 29 } 30 } 31 if( One ){ 32 printf("1 "); 33 for( int i = 0 ; i < n ; i++ ){ 34 printf("1 "); 35 } 36 puts(""); 37 }else if( n%2 == 0 ){ 38 printf("2 "); 39 for( int i = 0 ; i < n ; i++ ){ 40 printf("%d%c",i%2 ? 2 : 1 , i==n-1?' ':' '); 41 } 42 }else{ 43 if( Two ){ 44 printf("2 "); 45 int t = 2 ; 46 for( int i = 0 ; i < n ; i++ ){ 47 if( i == Pos ) t = t ^ 3 ; 48 t = t ^ 3 ; 49 printf("%d%c",t,i==n-1?' ':' '); 50 } 51 } 52 else{ 53 printf("3 "); 54 int t = 3 ; 55 for( int i = 0 ; i < n-1 ; i++ ){ 56 printf("%d ",i%2 ? 2 : 1 ); 57 } 58 printf("3 "); 59 } 60 } 61 } 62 return 0 ; 63 }