洛谷P2440 木材加工(基础二分思想)

题目来源:https://www.luogu.com.cn/problem/P2440

`
int n, k; int maxlen = -1;
int lenss[100010];

int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> lenss[i];
maxlen = max(lenss[i], maxlen);
}
int l = 1; int r = maxlen;
while (l + 1 < r) {
int mid = (l + r) / 2;
int res = 0;
for (int i = 0; i < n; i++) {
res += (lenss[i] / mid);
}
if (res < k) {
r = mid;
}
else {
l = mid;
}
}
//如果最后只剩两个数了,输出l,因为既然r可以来到这个位置,就说明r的位置必然!=k,见上面的判断条件,所以不用担心能不能更大、r有没有可能符合
if (l == 1) {
int res = 0;
for (int i = 0; i < n; i++) {
res += (lenss[i]);
}
if (res < k) {
cout << 0 << endl;//我们这里注意连1都切不出的特判情况
return;
}
}
cout << l << endl;
return 0;
}`

这道题在代码注释里标注了一下l\r\mid之间移动的理由,主要是只剩两个数的时候为什么要输出l,
然后就是本题特殊的情况(切不出任何的时候)但是要注意有种情况切1是符合的,所以不能一旦l==1就输出不行,还要再判断一遍

posted @ 2025-07-25 09:58  yubai111  阅读(15)  评论(0)    收藏  举报