Codeforces 1342 D. Multiple Testcases_取整


Codeforces 1342 D. Multiple Testcases_取整_02

题意:

给定 Codeforces 1342 D. Multiple Testcases_数组_03 个数 Codeforces 1342 D. Multiple Testcases_数组_04,每个 Codeforces 1342 D. Multiple Testcases_数组_05 都在 Codeforces 1342 D. Multiple Testcases_数组_06 的范围内再给定 Codeforces 1342 D. Multiple Testcases_取整_07 个数 Codeforces 1342 D. Multiple Testcases_数组_08,要求将所有的 Codeforces 1342 D. Multiple Testcases_数组_04 进行分组, Codeforces 1342 D. Multiple Testcases_数组_08 表示每组中大于等于 Codeforces 1342 D. Multiple Testcases_取整_11 的数不超过 Codeforces 1342 D. Multiple Testcases_数组_08

首先要求出最小分组 ,求出数组 Codeforces 1342 D. Multiple Testcases_取整_13 中大于等于 Codeforces 1342 D. Multiple Testcases_取整_11 的数字的个数。又因为 Codeforces 1342 D. Multiple Testcases_数组_08 数组表示每个分组大于等于 Codeforces 1342 D. Multiple Testcases_取整_11 的数字的最大个数。所以就能得到,对于数字 Codeforces 1342 D. Multiple Testcases_取整_11 而言,最小分组数为 Codeforces 1342 D. Multiple Testcases_数组_18 除以 Codeforces 1342 D. Multiple Testcases_数组_08

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

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;
}