题目链接:http://codeforces.com/contest/1102/problem/B
题意是用k个颜色n个数字标记,要求每个颜色至少标记一个数字,每个颜色标记的数字必须不同,能标记的话输出标记序列,不能输出NO。
思路就是我们对于出现次数大于k的肯定就是不行的,然后我们把每个数的出现次数和它的位置都存起来,然后依次去填数就好了,实现起来可能有点不太好实现。看代码会好理解一点。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int pre[5005][5005];
int main()
{
int n,k;
bool flag = true;
scanf("%d%d",&n,&k);
map<int,int> m;
for(int i=1;i<=n;i++){
int yy;
scanf("%d",&yy);
m[yy] ++;
pre[yy][m[yy]] = i;
if(m[yy] > k)flag = false;
}
int xx = 0;
bool flag1 = false;
int p[5005];
for(int i=1;i<=5000;i++){
for(int j=1;j<=m[i];j++){
p[pre[i][j]] = ++xx;
if(xx == k){
flag1 = true;
xx = 0;
}
}
}
if(flag == false || flag1 == false)puts("NO");
else{
puts("YES");
for(int i=1;i<=n;i++){
cout<<p[i]<<" ";
}
}
return 0;
}