题目名字
木材加工https://www.luogu.com.cn/problem/P2440
题意
n根木头,每根都切成l长的木头,l要最大
思路
先是定义函数,检查二分找出的长度是否符合题意,主函数主要是二分找出长度
坑点
多个木头加一起段数是k
最好储存根数用long long
算法一:XX+XX
函数加二分
实现步骤
- 定义函数,检查二分找出的长度是否符合题意
- 主函数主要是二分找出长度
代码
#include <iostream>
#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;//如果大于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返回的是真的时候,把 mid 调大一点
if (f(mid))
{
l = mid;
}
else
{
r = mid;
}
}
cout << l ;
return 0;
}
### 总结
>二分结构要牢记