欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Codeforces 1342 D. Multiple Testcases

程序员文章站 2024-03-17 08:13:40
...

Codeforces 1342 D. Multiple Testcases
Codeforces 1342 D. Multiple Testcases

题意:

给定 nn 个数 m[i]m[i],每个 mim_i 都在 [1,k][1,k] 的范围内再给定 kk 个数 cic_i,要求将所有的 m[i]m[i] 进行分组, cic_i 表示每组中大于等于 ii 的数不超过 cic_i 个.求最少能分几组,并输出分组方案。

首先要求出最小分组 ,求出数组 mm 中大于等于 ii 的数字的个数。又因为 cic_i 数组表示每个分组大于等于 ii 的数字的最大个数。所以就能得到,对于数字 ii 而言,最小分组数为 cnticnt_i 除以 cic_i 向上取整,然后找最大值。

得出最小分组 后
贪心即可,将数组循环放置。

AC代码:

const int N = 2e5 + 10;
int m[N], c[N], cnt[N];
vector<int> v[N];
int n, k;
int ans, res, tmp, maxn;
int main()
{
	sdd(n, k);
	rep(i, 1, n)
	{
		sd(m[i]);
		cnt[m[i]]++; //cnt数组表示等于i的数字个数
	}
	rep(i, 1, k)
		sd(c[i]);
	per(i, k, 1)
	{
		cnt[i] += cnt[i + 1]; //i位置依次加上后面的数量,表示大于等于i的数字个数
		maxn = max(maxn, (cnt[i] + c[i] - 1) / c[i]);
	}
	sort(m + 1, m + 1 + n); //对m数组排序,可选从大到小
	rep(i, 1, n)
	{
		v[i % maxn].push_back(m[i]); //循环放入vector
	}
	pd(maxn);
	rep(i, 0, maxn - 1)
	{
		printf("%d", v[i].size());
		for (int it : v[i])
			printf(" %d", it);
		printf("\n");
	}
	return 0;
}
相关标签: CodeForces 贪心