D. Multiple Testcases
CF 1342D
气死我了我就差一个ceil我的天wsm老这样我吐了我好难过555555555555
题意:
给定
n
、
k
n、k
n、k,给定
n
n
n个数组
m
i
m_i
mi,要求将其分组。
给定
k
k
k大小的数组
c
i
c_i
ci,要求每个组中大于等于
i
i
i的数字个数小于等于
c
i
c_i
ci。
求最小分组数anss,并输出每个分组内分配的数字。
思路:
一开始想的已经差不多了,就差一个ceil
先求出最小分组数anss:对
m
m
m数组排序,
d
p
i
dp_i
dpi记录大于等于
i
i
i的数字个数,当前的anss就是
c
e
i
l
(
d
p
i
/
c
i
)
ceil(dp_i/c_i)
ceil(dpi/ci),对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;
}
}