• 【规律】【CF1327-D】Carousel


    【题意】

      给定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 }
    View Code
  • 相关阅读:
    C#多线程学习笔记(三)——线程池
    html解析工具
    怎么样获取手机的主题
    我改进的《豆瓣搜》前后对比及源代码
    【收藏】Silverlight Style (二) 自定义样式在后台代码中应用
    C#多线程学习笔记(一)
    学习Linux——学习正确的思考方式(转)
    电信禁路由上网的破解方法
    印度软件业
    中国与印度软件工程师之比较
  • 原文地址:https://www.cnblogs.com/Osea/p/12603390.html
Copyright © 2020-2023  润新知