帮我做道C++题:小明成了一名伐木工,他要在林场得到 M M米的木材。由于国家提倡节约资源,尽量保护森林,开发了一种神奇的砍伐工具,可以只砍掉树木顶端部分,沿着同一高度 H H, H H以上的部分被砍伐。 问,林场中的 N N棵树木,至多设定砍伐高度为多少,可以达到小明的木材需求。 输入格式 第一行两个整数 N ( 1 <= N <= 1000000 ) N(1<=N<=1000000)和 M ( 1 <= M <= 2000000000 ) M(1<=M<=2000000000),分别表示树木数量和所需木材数。 第二行 N N个整数,表示 N N棵树木的高度,高度不超过 10 9 109。长度总和肯定超过 M M,肯定能满足小明的需求。 输出格式 输出伐木机器设定高度。请直接给出完整代码,不要思路
时间: 2023-02-07 17:16:55 浏览: 108
下面是 C 语言的完整代码:
```
#include <stdio.h>
int main()
{
int n, m;
scanf("%d%d", &n, &m);
int heights[n];
for (int i = 0; i < n; i++)
scanf("%d", &heights[i]);
int low = 1, high = 0;
for (int i = 0; i < n; i++)
if (heights[i] > high)
high = heights[i];
int result = 0;
while (low <= high)
{
int mid = (low + high) / 2;
long long sum = 0;
for (int i = 0; i < n; i++)
if (heights[i] > mid)
sum += heights[i] - mid;
if (sum < m)
high = mid - 1;
else
{
result = mid;
low = mid + 1;
}
}
printf("%d\n", result);
return 0;
}
```
这是一个二分查找的问题。我们可以使用二分查找来快速找到砍伐高度的最大值。
算法流程:
1. 读入树木数量 n 和所需木材数 m。
2. 读入每棵树的高度,并找出所有树的最大高度 high。
3. 设置 low 和 high 变量,分别表示砍伐高度的下界和上界。初始时,low 的值为 1,high 的值为所有树的最大高度。
4. 进入循环,当 low 小于等于 high 时循环。
5. 在循环内部,计算砍伐高度的中点 mid,并遍历所有树,如果高度大于 mid,则将这棵树的高度减去 mid,并累加到 sum 变量中。
6. 判断 sum 是否小于 m,如果是,则将 high 设为 mid-1,否则将 result 设为 mid,
阅读全文