P2440 木材加工
[题目链接]https://www.luogu.com.cn/problem/P2440
题意
有n 根原木,现在想把这些木头切割成k 段长度均为 l 的小段木头,l 的值越大越好,且要求长度是正整数。
思路
- 先自定义函数,用于检查给定的长度是否满足条件
- 函数f(mid)用来检查给定的长度mid是否满足条件
- 用二分法找出mid
坑点
- 每段木头分别切,不是连在一起切
算法一:XX+XX
时间复杂度
$
实现步骤
- 先定义一个函数
- 后套用二分模版寻找最大值
代码
#include <algorithm>
using namespace std;
long long n, k;
long long a[1000005];
//自定义函数 用于检查给定的长度是否满足条件
//函数f(mid)用来检查给定的长度mid是否满足条件,
//即能够将原木切割成k段长度均为mid的小段木头。
bool f(long long x) {
long long ans = 0;
for (int i = 1; i <= n; i++) {
ans += a[i] / x;
}
return ans >= k;
}
int main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
//l表示小段木头的最小长度,r表示小段木头的最大长度
long long l = 0, r = 100000001;
//l的最大值肯定不超过r
long long mid;
//是l+1小于r ,确保l在r的附近,但比r小
while (l + 1 < r) {
mid = (l + r) / 2;
//调用函数f,如果返回值为true,则将l更新为mid。
if (f(mid))
{
l = mid;
}
else
{
r = mid;
}
}
总结
需要正确理解题意,合理应用已学知识。