题目链接: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;
}