D. Carousel.(简单做法)Codeforces.Round #629 (Div. 3)
Posted lh2000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Carousel.(简单做法)Codeforces.Round #629 (Div. 3)相关的知识,希望对你有一定的参考价值。
题目大意
给一个数组,入伙前后两个元素值不同则必须让他们染不同的颜色,问你如何染色能使得使用的颜色种类最少
做法
用贪心的思路,从前往后扫一遍数组按照题目中的规则,如果与前一个元素相同就染同样的颜色,不同就染不一样的,但是只染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)的主要内容,如果未能解决你的问题,请参考以下文章
bigdata hadoop java codefor wordcount 修改
EC R 87 div2 D. Multiset 线段树 树状数组 二分