Wonderful Coloring

编程入门 行业动态 更新时间:2024-10-10 12:26:20

<a href=https://www.elefans.com/category/jswz/34/1726431.html style=Wonderful Coloring"/>

Wonderful Coloring

Wonderful Coloring - 2 贪心

题目来源:Codeforces Round #734 (Div. 3) B2

description

有一个元素是整数的数列,有k个颜色去涂这些元素
求涂色方案,需满足以下条件
(1)每一个元素都可以涂成一种颜色或者不涂;
(2)要求数值一样的元素不能涂相同颜色;
(3)并且k个颜色分别涂的数量要相等
(3)在此基础上我们的方案是让涂色的元素数量最大,可能会有多种方案,输出一种

solution

直接贪心:
  简单的做法就是排个序,然后如果一个整数的数量大于k,就k个颜色都涂一遍,剩下的不涂,其他的就按顺序1,2,3,…,k 这样涂下去然后循环。
  最后一个循环涂色时很大可能会出现1->k没有遍历完的情况也就是涂色数量不等了,这不符合要求,所以把这些"尾巴"选择不涂色。
  方便编程我写了多个数组去存取不同阶段的数列,具体实现看代码。
(有更巧妙的方法不需要排序)

Code

#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN = 2e5;
int a[MAXN+10];
int b[MAXN+10];
int c[MAXN+10]; 
queue<int> q[MAXN+10];
int main()
{ios::sync_with_stdio(false);int t;cin>>t;while(t--){int n,k;cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];c[i] = a[i];  // 保存原始数组至 c }sort(a+1,a+n+1); // dont forget +1 int j=1;int cnt=1;b[1]=a[1];// 将已经排好序的 a数组去掉数量大于 k的元素然后放到 b数组中 for(int i=2;i<=n;i++){//当前连续cnt个 if(a[i]==a[i-1]){cnt++;}else{cnt=1;}//连续cnt个是否超过k if(cnt<=k){j++;b[j]=a[i];}else{continue;}}int n2 = j/k*k;  // 多余的余数部分就不要了 int now=1;for(int i=1;i<=n2;i++){//cout<<b[i]<<" ";//cout<<"in "<<now<<endl;q[b[i]].push(now);  // 利用queue保存每一个整数的涂色方案 now++;if(now>k) now=1;}// output for(int i=1;i<=n;i++){if(q[c[i]].empty()) {cout<<"0 ";}else{int ft = q[c[i]].front();q[c[i]].pop();cout<<ft<<" ";}}cout<<endl;}return 0;
}

更多推荐

Wonderful Coloring

本文发布于:2024-03-09 23:23:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1726427.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Wonderful   Coloring

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!