Codeforces Round #531 (Div. 3) B. Array K-Coloring (结构体排序)

-
题意:给你\(n\)个数字,用\(k\)种颜色给他们涂色,要求每个数字都要涂,每种颜色都要用,相同的数字不能涂一样的颜色.
-
题解:用结构体读入每个数字和它的位置,然后用桶记录每个数字出现的次数,判断是否合法,然后对数字进行排序,从\([1,k]\)不断循环的去涂颜色,这样的好处是一定能保证相同数字涂的颜色不同,然后再按位置排序输出即可.
-
代码:
struct misaka{ int val; int id; int col; }e[N]; int n,k; map<int,int> mp; int mx; bool cmp1(misaka a,misaka b){ return a.val<b.val; } bool cmp2(misaka a,misaka b){ return a.id<b.id; } int main() { //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); n=read(); k=read(); for(int i=1;i<=n;++i){ e[i].val=read(); e[i].id=i; mp[e[i].val]++; } for(auto w:mp){ mx=max(mx,w.se); } if(mx>k) puts("NO"); else{ puts("YES"); sort(e+1,e+1+n,cmp1); int cnt=1; for(int i=1;i<=n;++i){ e[i].col=cnt; cnt++; if(cnt==k+1) cnt=1; } sort(e+1,e+1+n,cmp2); for(int i=1;i<=n;++i){ printf("%d ",e[i].col); } } return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号