D.複数のテストケース
CF 1342D 私はとても怒っています、私はただの天井
です、私の神、wsmは常にこのようなものです、私は投げます、私はとても悲しいです555555555555
意味:
与えられたn、kn、kn 、k、nnを指定n個の配列mi m_iメートル私、それらをグループ化するリクエスト。
与えられた(株)kサイズの配列ci c_ic私、各グループがii以上である必要がありますiの桁数がci c_i以下であるc私。
グループanssの最小数を見つけ、各グループに割り当てられた数を出力します。
アイデア:
私は最初にそれについて考えます、唯一の違いがあります天井
最初に最小グループ化数anssを見つけます:mmの場合m配列ソート、dpi dp_id p私ii以上のレコードiの数、現在のanssはceil(dpi / ci)ceil(dp_i / c_i)です。c e i l (d p私/ c私)、anssの最大値を取る
int n;
vector<LL> ans[maxn];
LL m[maxn],c[maxn],dp[maxn],mp[maxn],anss;
int main(){
LL n=lrd(),k=lrd();
anss=0;
for(int i=1;i<=n;i++){
m[i]=lrd();mp[m[i]]++;}
sort(m+1,m+1+n);
for(int i=k;i>=1;i--)dp[i]=dp[i+1]+mp[i];
for(int i=1;i<=k;i++){
c[i]=ird();anss=max(anss,(dp[i]+c[i]-1)/c[i]);}
cout<<anss<<endl;
int nw=0;
for(int i=n;i>=1;i--){
ans[nw].push_back(m[i]);
nw++;
nw%=anss;
}
for(int i=0;i<anss;i++){
cout<<ans[i].size()<<" ";
for(int j=0;j<ans[i].size();j++)
cout<<ans[i][j]<<" ";
cout<<endl;
}
}