对于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; }