Educational Codeforces Round 86 (Rated for Div. 2) D Multiple Testcases

考虑按照从大到小的顺序一个一个依次填充下去(平均分配)

ans可以二分,也可以直接求

时间复杂度O(n+K)

#include<bits/stdc++.h>

using namespace std;

#define N 200005

int n, K, i, now, ans, j, x, a[N], c[N], sum[N];
vector<int> b[N];

int main (void)
{
	scanf("%d%d",&n,&K);
	for (i=1; i<=n; i++) scanf("%d",&x),a[x]++; 
	for (i=1; i<=K; i++) scanf("%d",&c[i]);
	for (i=K; i>=1; i--) sum[i]=sum[i+1]+a[i];
	for (i=1; i<=K; i++) ans=max(ans,sum[i]/c[i]+(sum[i]%c[i]>0?1:0));
	printf("%d
",ans);
	now=0;
	for (i=K; i>=1; i--) for (j=1; j<=a[i]; j++) {
		now=now%ans+1;
		b[now].push_back(i);
	}
	for (i=1; i<=ans; i++) {
		printf("%d ",b[i].size());
		for (j=0; j<b[i].size(); j++) printf("%d ",b[i][j]);
		puts("");
	}
	
	return 0;
}

  然而昨天晚上并没有想出来QAQ wtclQwQ

原文地址:https://www.cnblogs.com/chinakevin/p/12787948.html