Codeforces1342D-複数のテストケース

補足!

質問の意味: n個の数m [i]が与えられると、各m [i]は[1、k]の範囲内にあり、次にk個の数c [i]が与えられると、すべてのm [i]を処理する必要があります。グループ化、c [i]は各グループにi以上のc [i]ないことを意味します。少なくとも分割できるグループの数を尋ね、グループ化スキームを出力します。

回答:

まず、最小のグループqを見つけます。配列at [i]を指定します。配列m内のi以上の数の数、q = max(q、(at [i] + c [i] -1)/ c [i]);

次にグループ化します。配列mをソートし、a [0] a [1] a [2] ... a [q-1] ... a [0] ..の順序で割り当てます。上記のqの解法によれば、同じグループの数字が質問の意味と矛盾しないことが保証されます。

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+50;
int m[maxn],c[maxn],at[maxn];
vector<int> a[maxn];
int n,k,q=1;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>m[i];
		at[m[i]]++;
	}
	for(int i=1;i<=k;i++) cin>>c[i];
	for(int i=k;i>=1;i--) {
		at[i]+=at[i+1];
		q=max(q,(at[i]+c[i]-1)/c[i]);
	}
	sort(m+1,m+1+n);
	for(int i=1;i<=n;i++){
		a[i%q].push_back(m[i]);
	}
	cout<<q<<endl;
	for(int i=0;i<q;i++){
		cout<<a[i].size();
		for(int j:a[i]) cout<<' '<<j;
		cout<<endl;
	}
	return 0;
}

参照リンク:https//www.cnblogs.com/stelayuri/p/12785409.html

おすすめ

転載: blog.csdn.net/qq_44132777/article/details/105794672