题目链接 Problem - B2 - Codeforces
变量 m 为数组长度,n为颜色数量
我的思路 就是把大于等于 n 的一种元素献给染上颜色
然后在继续遍历小于 n 的元素
思路理清后,首先我先将数组里的数按照元素个数
我是用了两次 sort 将其排好序
bool cmp(st a,st b)//先将数给排一边,不排的话下一步排序会排 出错的
{
return a.num<b.num;
}
bool cmpt(st aa,st bb)//a是记录元素个数
{
return a[aa.num]>a[bb.num];
}
//main中其中一部分
int m,n; cin>>m>>n;
memset(a,0,sizeof a);
for(int i=1;i<=m;i++)
{
int x; cin>>x;
U[i].num=x;U[i].idx=i;
a[x]++;U[i].cl=0;
}
sort(U+1,U+1+m,cmp);
sort(U+1,U+1+m,cmpt);
第二步,开始遍历元素,并对其染色
int i;
for(i=1;i<=m;)
{
int x=a[U[i].num];
if(x>=n)
{
for(int t=1;t<=n;t++)
U[t+i-1].cl=t;
i+=x;
}
else break;
}
//上边是对大/等于 n 的染色
//下面是对 小于 n 的染色
int w=0;
for(int t=i;t<=m-(m-i+1)%n;t++)
{
U[t].cl=++w;
w=w%n;
}
最后就是输出
wa test 3 120组代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N];
struct st
{
int num,idx,cl;
}U[N];
bool cmp(st a,st b)
{
return a.num<b.num;
}
bool cmpt(st aa,st bb)
{
return a[aa.num]>a[bb.num];
}
bool cmpx(st a,st b)
{
return a.idx<b.idx;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int m,n; cin>>m>>n;
memset(a,0,sizeof a);
for(int i=1;i<=m;i++)
{
int x; cin>>x;
U[i].num=x;U[i].idx=i;
a[x]++;U[i].cl=0;
}
sort(U+1,U+1+m,cmp);
sort(U+1,U+1+m,cmpt);
int i;
for(i=1;i<=m;)
{
int x=a[U[i].num];
if(x>=n)
{
for(int t=1;t<=n;t++)
U[t+i-1].cl=t;
i+=x;
}
else break;
}
int w=0;
for(int t=i;t<=m-(m-i+1)%n;t++)
{
U[t].cl=++w;
w=w%n;
}
sort(U+1,U+1+m,cmpx);
for(i=1;i<=m;i++)
cout<<U[i].cl<<' ';cout<<'\n';
}
return 0;
}