#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,k,s,maxx;
int a[100001];
bool pd(int x){
ll p=0;
for(ll i=0;i<n;i++)
p+=a[i]/x;
if(p>=k){
return true;
}
else return false;
}
void search(ll l,ll r){
ll mid=(l+r)/2;
if(pd(mid)&&!pd(mid+1)) {cout<<mid;return;}
if(pd(mid)) return search(mid,r);
else return search(l,mid);
}
int main(){
cin>>n>>k;
for(ll i=0;i<n;i++){scanf("%d",&a[i]);s+=a[i];}
maxx=*max_element(a,a+n);
if(k>s){
cout<<0;
return 0;
}//special judge
search(1,maxx);
return 0;
}
分析:由条件,一个个枚举木材最长的长度会超时,因此想到使用二分法寻找,这题无论是边界还是递推公式的很好找(逃