CF-Round #629-div3-D题
D. Carousel
本题贪心~
一看题目感觉是一个涂色问题(还以为是我原来数学解题的那种涂色问题)
但是这个涂色比以前的简单一些~
没规定相同的种类需要涂不同的颜色。
题目大意:给你一些动物种类,他们组成圆环。给他们涂上颜色。
要求使用最少的颜色。并且不同种类如果在一起的话不能出现相同的颜色。
贪心策略:
我们想想:如果只有一种动物。那么就只需要一种颜色。
如果动物是even偶数个。
那么我们可以这样涂色:1 2 1 2 1 2
这样可以保证题目要求(这个地方就是我说的相同种类的动物可以涂不同的颜色)
如果动物有odd奇数个。
那么我们找一下有没有相同种类的两只动物是连在一起的。有的话。我们可以让这两只动物涂上相同的颜色。
相当于把这两只动物看作一只动物。就回到了上面偶数个的请况了。只需要两种颜色
如果没有两只相同种类的动物连在一起。
我们需要三种颜色(最多也只需要三种颜色)
例如这样的排列:
1 2 1 2 1 2 1 2 3
最后一只动物涂上3的颜色。
可以保证符合题目要求并且颜色种类最少
喵~代码部分
还是很简单的~
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int t;
int n;
void solve()
{
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
if (count(a.begin(), a.end(), a[0]) == n)
{
cout << 1 << endl;
for (int i = 0; i < n; i++)
{
cout << 1 << " ";
}
cout << endl;
return ;
}
if (!(n % 2))
{
cout << 2 << endl;
for (int i = 0; i < n; i++)
{
cout << i % 2 + 1 << " ";
}
cout << endl;
return ;
}
for (int i = 0; i < n; i++)
{
if (a[i] == a[(i + 1) % n])
{
vector<int> ans(n);
for (int j = 0, pos = i; pos >= 0; pos--, j ^= 1)
{
ans[pos] = j + 1;
}
for (int j = 0, pos = i + 1; pos < n; pos++, j ^= 1)
{
ans[pos] = j + 1;
}
cout << 2 << endl;
for (int j = 0; j < n; j++)
{
cout << ans[j] << " ";
}
cout << endl;
return ;
}
}
cout << 3 << endl;
for (int i = 0; i < n - 1; i++)
{
cout << i % 2 + 1 << " ";
}
cout << 3 << endl;
return ;
}
int main()
{
cin >> t;
while (t--)
{
solve();
}
return 0;
}