似乎以前做过
二分
使用堆
上次用的sort就直接挂掉了
#include<bits/stdc++.h>
using namespace std;
#define in Read()
int in{
int i=0,f=1;char ch=0;
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') ch=getchar(),f=-1;
while(isdigit(ch)) i=(i<<1)+(i<<3)+ch-48,ch=getchar();
return i*f;
}
const int N=3e5+5;
int n,lim,a[N];
int value(int k){
priority_queue<int>q;
int val=0;
for(int i=1;i<=n;++i) q.push(-a[i]);
int cnt=k-(n%(k-1));
for(int i=1;i<=cnt;++i) q.push(0);
while(q.size()>1){
int tmp=0;
for(int i=1;i<=k;++i) tmp-=q.top(),q.pop();
q.push(-tmp);
val+=tmp;
}
return val;
}
int main(){
n=in,lim=in;
for(int i=1;i<=n;++i) a[i]=in;
int ans,l=2,r=n;
while(l<=r){
int mid=l+r>>1;
if(value(mid)<=lim) r=mid-1,ans=mid;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}