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

京公网安备 11010502036488号