好像题目比较水
先特判一下总长度是否有k长,没有就直接输出0
然后就是二分查找了,来查找木材的长度
比k段多或等于,就左边界向右移动,并且每次维护一下答案的最大值
#include <bits/stdc++.h>
using namespace std;
int n, k;
int a[100010];
int ans;
long long sum = 0;
int p(int length) { //传进来的是木头长度
int tot = 0;
for (int i = 1; i <= n; i++) {
tot += a[i] / length;
}
if (tot >= k) { //如果切的比较k多,说明最大长度还能大左边界右移
return 1;
} else
return 0;//少的话代表
}
int main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
sum += a[i];
}
if (sum <= k) {
cout << "0";
return 0;
}
sort(a + 1, a + 1 + n);
int left = 0, right = a[n];
int mid = 0;
while (left <= right) {
mid = (left + right) / 2;
if (p(mid)) {
ans = max(ans, mid);
left = mid + 1 ;
} else
right = mid - 1;
}
cout << ans ;
}
比k段少,就有边界向左移动。