返回顶部

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;
    }
    
posted @ 2020-09-05 17:43  _Kolibri  阅读(168)  评论(0)    收藏  举报