B2. Wonderful Coloring - 2
https://codeforces.com/contest/1551/problem/B2
题意:给定数字n和k以及n个数,现在要对n个数进行上色,颜色共有k种,要求每种颜色不能上重复的数字,并且每种颜色涂染的数字的数量相同,求染色数字最多的方案数。
思路:按数字出现的次数从高到低对数组进行排序,得到排序后的数组s,然后双指针依次考虑当前的元素s[i],[i, i + k - 1]均匀的分配给k个颜料,可以保证没有每个颜料没有重复的元素,并且每个颜料染色的数量均等的增加。 随后,从i + k开始判定,所有与s[i]相等的数字不上色,一直到当前的i到数字末尾不够k个元素为止。
总结:题目有点绕,总的核心点是,要让相同的元素相邻,然后暴力的k个k个的提取就行了。还有注意在sort排序时,lambda函数接受的不是下标,而是当前数组的元素,要特判cnt[i] == cnt[j]的情况。
inline void solve() {
int n, k;
cin >> n >> k;
vector<int> a(n), cnt(n + 1);
for (auto& x : a) {
cin >> x;
cnt[x] ++;
}
auto s = a;
sort(s.begin(), s.end(), [&](const int i, const int j) {
return cnt[i] != cnt[j] ? cnt[i] > cnt[j] : i > j;
});
map<int, vector<int>> ans;
for (int i = 0; i + k - 1 < n;) {
int v = s[i];
int now = 1;
int j;
for (j = i; j < i + k; ++j) {
ans[s[j]].push_back(now++);
}
while (j < n && s[j] == v) {
j ++;
}
i = j;
}
for (int i = 0; i < n; ++i) {
if (ans[a[i]].empty()) {
cout << 0;
}
else {
cout << ans[a[i]].back();
ans[a[i]].pop_back();
}
cout << " \n"[i == n - 1];
}
}

浙公网安备 33010602011771号