跳石头tst
题目链接
https://www.luogu.com.cn/problem/P2678
题意
有n根木头,分成K段,每段长度为L,求L的最大值
思路
- 定义木材长度,数量
- 用二分法,for循环
- 找出最小长度,最大长度
while 嵌套 if 判断
坑点
- 如果连 1cm1cm 长的小段都切不出来,输出 0 容易忘
算法一:二分
时间复杂度
入门
实现步骤
- for循环+二分+判断
代码
#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;
}
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;
}
}
cout << l ;
return 0;
}
————————————————
版权声明:本文为CSDN博主「pandawen123」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pandawen123/article/details/134558142