码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-03-27 11:16:54      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:name   lse   情况   names   cin   两种   for   ORC   else   

题目大意

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

做法

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

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

代码

#include<bits/stdc++.h>
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<<c[i]%2+1<<" ";
            else cout<<c[i]<<" ";
        }
    }
    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<<c[i]<<" ";
        }
    }
    cout<<endl;
}
int main(){
    int t;
    cin>>t;
    while(t--)
    {
        solve();
    }
} 

 

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

标签:name   lse   情况   names   cin   两种   for   ORC   else   

原文地址:https://www.cnblogs.com/LH2000/p/12579592.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!