D. Carousel.(简单做法)Codeforces.Round #629 (Div. 3)

题目大意

给一个数组,入伙前后两个元素值不同则必须让他们染不同的颜色,问你如何染色能使得使用的颜色种类最少

做法

用贪心的思路,从前往后扫一遍数组按照题目中的规则,如果与前一个元素相同就染同样的颜色,不同就染不一样的,但是只染1,2两种颜色。

由于是个环,最后只需要判断一下最后一个元素是不是和第一个元素不同的情况下染了相同的颜色,如果是,就看数组中有没有染了相同的颜色还挨在一起,如果有,把后面一个元素的颜色换成与前一个元素不同的,并且后面所有的元素都换成与原来相反的 x%2+1 ;正常输出即可。

代码

#include
using namespace std;
int c[200005];
int b[200005];
void solve(){
    int n;
    cin>>n;
    c[0]=2;
    int flag=0,check=0,fl=0;
    for(int i=1;i<=n;i++){
        cin>>b[i];
        if(b[i]==b[i-1]){
            flag=i;
            c[i]=c[i-1];
        }
        else {
            c[i]=c[i-1]%2+1;
            if(i!=1)fl=1;
        }
    }
    if(b[n]!=b[1]&&c[n]==c[1]) check=1;
    if(check&&flag){
        cout<<2<<endl;
        for(int i=1;i<=n;i++){
            if(i>=flag) cout<2+1<<" ";
            else cout<" ";
        }
    }
    else{
        if(check) cout<<3<<endl;
        else if(fl)cout<<2<<endl;
        else cout<<1<<endl;
        for(int i=1;i<=n;i++){
            if(check&&i==n)cout<<3<<" ";
            else cout<" ";
        }
    }
    cout<<endl;
}
int main(){
    int t;
    cin>>t;
    while(t--)
    {
        solve();
    }
} 

 

你可能感兴趣的:(D. Carousel.(简单做法)Codeforces.Round #629 (Div. 3))