首先在输入的时候,记录下可切割答案的最大值,之后便在这个区间中二分。由于需要得到满足切割数量的最大长度,所以需要在答案中往右二分,只要check得到的数大于等于所需要满足的切割数量,就继续往右二分,直到找到最后一个满足条件的切割长度,即为所求解。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100001];
int n,m;
ll check(int n)
{
ll cnt=0;
for(int i=0;i<n;i++)
{
cnt+=a[i]/n;
}
return cnt;
}
int main()
{
ll sum=0;
cin>>n>>m;
int maxn=0xc0c0c0c0;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
maxn=max(maxn,a[i]);
}
if(sum<m)
{
cout<<0<<endl;
return 0;
}
int l=1,r=maxn;
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid)>=m) l=mid;
else r=mid-1;
}
cout<<l<<endl;
return 0;
}