cf1342 D. Multiple Testcases(思维)

题目链接

题意

给定n个数m[i],1≤m[i]≤k,再给定k个数c[i],对m进行分组,使得在满足条件的情况下分的组数最少,条件为每组大于等于i的数不超过c[i]个

题解

针对第i个数m[i],要有大于等于m[i]的数分组时要有:组数≥“这些数的个数”/c[m[i]],故要对每一个m[i]计算组数取最大值就是最少的组数
之后贪心由大到小循环分组即可

#include <bits/stdc++.h>
#include <unordered_set>
#include <unordered_map>
#define _for(i, a, b) for(int i = a; i < b; ++i)
#define _rep(i, a, b) for(int i = a; i <= b; ++i)
#define _dim(i, a, b) for(int i = a; i >= b; --i)
#define closeIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define debug cout << "******************" << endl
#define FREE freopen("in.txt", "r", stdin)
#define FREO freopen("out.txt", "w", stdout)
#define ls l, m, rt << 1
#define rs m + 1, r, rt << 1 | 1
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> pii;
typedef long double LD;
const int MAXN = 2e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const LD PI = acos(-1);
const LD eps = 1e-10;
int n, k, m[MAXN], c[MAXN];
vector<int> vec[MAXN];
int main() {
	scanf("%d%d", &n, &k);
	_rep(i, 1, n) scanf("%d", &m[i]);
	_rep(i, 1, k) scanf("%d", &c[i]);
	sort(m + 1, m + n + 1);
	int ans = 0;
	_rep(i, 1, n) ans = max(ans, (n - i) / c[m[i]] + 1);
	printf("%d\n", ans);
	for (int i = n, j = 0; i; --i, j = (j + 1) % ans)
		vec[j].push_back(m[i]);
	for (int i = 0; i < ans; ++i) {
		printf("%d", vec[i].size());
		for (auto x : vec[i]) printf(" %d", x);
		printf("\n");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值