#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,a[N];
bool cheak(int x){//切割长度为x时,能否获得至少m段木头
int cnt=0;
if(x==0) return 1;//由于把0也作为切割长度,故特判
for(int i=0;i<n;i++){
cnt+=a[i]/x;
if(cnt>=m) return 1;
}
return 0;
}
int b_search(int l,int r){
while(l<r){
int mid=l+r+1>>1;
if(cheak(mid)) l=mid;//满足橙色性质
else r=mid-1;
}
return l;
}
int main()
{
cin>>n>>m;//共n段原始木头 切割后获得m段木头
for(int i=0;i<n;i++)
cin>>a[i];
//在获得m段木头的前提下,输出能切割的最大长度
//m段木头的长度区间在 1~1e8之间
//但题目数据可能存在1cm都切不出的情况,为了代码简洁,只需在chaek()函数中特判切割长度为0cm的情况即可
//故 m段木头的长度区间在 0~1e8之间
cout<<b_search(0,1e8)<<endl;
return 0;
}
P2440 木材加工
最新推荐文章于 2024-08-14 20:03:33 发布