题目大意:
给定 n n n个木头及其长度,要求把这些木头切割成 k k k块长度相同的小段木头(木头有可能有剩余),求小段木头的最大值。
思路/分析:
首先,用二分找长度,然后判断下这个长度可不可行。但是要注意 最多可分为K段的情况下,木头的长度也有很多种情况,要找到这里面的最大值。
代码:
#include <bits/stdc++.h>
using namespace std;
int N,K,len[100005];
int cmp(int a, int b){
return a > b;
}
int main(){
cin >> N >> K;
long long sum = 0;
for (int i = 0; i < N; i++) {
cin >> len[i];
sum += len[i];
}
if(sum < K){
cout << '0' << endl;
}
else{
sort(len, len + N, cmp);
}
//二分找长度
int mid,cnt,l,r;
for(l = 1, r = len[0];l <= r;){
mid = l + r >> 1;
cnt = 0;
for(int j = 0; j < N; j++){
cnt += len[j] / mid;
if (cnt > K || cnt <= K && len[j] < mid){
break;
}
}
if (cnt >= K){
l = mid + 1;
}
else if(cnt < K){
r = mid - 1;
}
}
cout << r << endl;
return 0;
}