Codeforces Round #734 (Div. 3) B2. Wonderful Coloring - 2
作者:
Snow_raw
,
2021-07-24 15:56:12
,
所有人可见
,
阅读 424
有t个样例,每个样例的第一行有一个n和一个k代表长度为n的布条和最多染色有k个种类
第二行是每单位布条的value,限制条件:每个相同的值不能染一样的颜色,且每个颜色的染色数目相同,求最大的颜色染色数
10 3
3 1 1 1 1 10 3 10 10 2
1 1 2 3 0 1 2 2 3 *3
1出现了4次,那么第四次出现次数>k=3任何一个颜色都不能染,所以第四次出现的位置为0。其余三个1分配给3个不同颜,
其他数字也相同,需要注意标记处的值不是1而是3,虽然2是第一次出现但为了满足最大的颜色数目且各颜色数相等所以
当标记处的值是3时最大的颜色数目为3,即最优解之一(本题难点所在)。
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,k;
cin>>n>>k;
int num=0;
priority_queue<pair<int,int>>heap;
unordered_map<int,int>hash;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
hash[a[i]]++;
if(hash[a[i]]<=k){
num++;
heap.push(make_pair(a[i],i));
}
else if(hash[a[i]]>k){
a[i]=0;
}
}
int g=num;
num-=num%k;
g-=num;
int f=1;
while(num--){
int x=heap.top().second;
heap.pop();
a[x]=f;
f=f%k+1;
}
while(g--){
int x=heap.top().second;
heap.pop();
a[x]=0;
}
for(int i=0;i<n;i++)cout<<a[i]<<' ';
cout<<endl;
}
return 0;
}
好腻害,但是貌似应该放在题解里把(
hh cf的题当分享啦
哦哦