对于k的值是具有单调性,考虑二分。(单调性一般就先考虑二分),再看一下数据能过。

#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define maxn 110000
ll n,k,max1=0;
ll L[maxn];
bool check(ll mid)//判断mid是否合法,即所分成的木棍数是否满足k
{
    ll ans=0;
    for(int i=1;i<=n;++i)
    {
        if(L[i]<mid) continue;
        ans+=L[i]/mid;
    }
    if(ans<k) return 0;
    else return 1;
}
int main()
{
    cin>>n>>k;
    for(ll i=1;i<=n;++i) cin>>L[i],max1=max(max1,L[i]);
    ll l=1,r=max1,h=0;
    while(l<r)
    {
        ll mid=(l+r)/2+1;//扩大二分的范围,避免出错
        if(check(mid)) h=mid,l=mid+1;
        else r=mid-1;
    }
    if(check(h+1)) cout<<h+1;//在精确一下,我二分一般莫名其妙卡在r,l边界值,这个保险点
    else cout<<h;
    return 0;
}