洛谷P2440 木材加工 题解 二分答案
题目链接:https://www.luogu.com.cn/problem/P2440
首先,我们可以编写一个 bool check(int len)
函数,该函数用于验证小段长度为 len 时,得到的小段的数量是否达到了 K 根。
可以发现:随着 len 的增加,可以砍伐的小段的数量肯定是单调非递增的(即要么不变,要么减少)。
也就是说:
存在一个 X,使得当 len ≤ X 时,check(len)
均返回 true;当 len ≥ X+1 时,check(len)
均返回 false。
于是我们可以将 len 作为自变量,将 check(len)
最为应变量来进行二分,找到这个最大的 X。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
int n, k, a[100010];
bool check(int len)
{
int cnt = 0;
for (int i = 0; i < n; i ++)
{
cnt += a[i] / len;
if (cnt >= k)
return true;
}
return false;
}
int main()
{
cin >> n >> k;
for (int i = 0; i < n; i ++)
cin >> a[i];
int L = 1, R = 100000000, res = 0;
while (L <= R)
{
int mid = (L + R) / 2;
if (check(mid))
{
res = mid;
L = mid+1;
}
else
R = mid-1;
}
cout << res << endl;
return 0;
}