#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;
}
分析:由条件,一个个枚举木材最长的长度会超时,因此想到使用二分法寻找,这题无论是边界还是递推公式的很好找(逃
本文介绍了一种使用二分查找算法解决木材切割问题的方法,通过枚举木材的最长可能长度并使用二分法进行优化,避免了超时问题。代码实现包括输入输出、条件判断及特殊情况处理。
5501

被折叠的 条评论
为什么被折叠?



