题目:
给定n个木头及其长度,要求把这些木头切割成k块长度相同的小段木头,求小段木头的最大值。
题解:
二分,从0到最大长度的木材,如果获得段数满足则赋值,否则继续二分,直到完成并取最大值。
代码:
#include<bits/stdc++.h>
using namespace std;
#define f(i,n) for(int i=0;i<n;++i)
const int N = 1e5 + 1;
int a[N];
typedef long long ll;
int main() {
int n, k;
scanf("%d%d", &n, &k);
f(i,n)
scanf("%d", &a[i]);
sort(a, a + n);//排列木材
int l = 0, r = a[n - 1], mid;
int num = 0,//木材根数
ans = 0;
while(l<r-1){
mid=(l+r)/2;
f(i,n)
if(a[i]>mid)
num+=a[i]/mid;//当前木材可以取得的根数
if(num>=k){//取值太小,扩大mid数值
l=mid;//l扩大,mid扩大,ans扩大
ans=max(ans,mid);
}
else//取值太大,缩小mid数值
r=mid;
num=0;//重置
}
printf("%d\n", ans);
return 0;
}