洛谷 P1873 砍树

砍树

二分答案,难度较低。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
//Mystery_Sky
//
#define M 10000100
#define ll long long 
#define INF 0x7f7f7f7f
ll l, r, mid;
int n, m, a[M];
inline bool check(ll ans)
{
    ll sum = 0;
    for(int i = 1; i <= n; i++) {
        if(a[i] > ans)  sum += (a[i] - ans);
    }
    return sum >= m;
}

int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    l = 0, r = INF;
    while(l < r) {
        mid = (l + r + 1) / 2;
        if(check(mid)) l = mid;
        else r = mid - 1;
    }
    printf("%lld\n", l);
    return 0;
}

转载于:https://www.cnblogs.com/Benjamin-cpp/p/10877694.html

### 关于洛谷 P1873 问题的数据 对于洛谷平台上编号为P1873的问题,即[COCI 2011/2012 #5] EKO / 砍树这一挑战,其核心在于通过二分查找来确定能够获取特定量木材的最大砍伐高度。此题设定如下: - 给定`N`棵树的高度列表以及目标木材总量`M`。 - 要求计算并返回一个最高的整数值作为伐木机的切割高度`H`,使得从这些树木上获得的总木材长度不低于`M`。 #### 输入格式 输入的第一行为两个正整数`N`和`M`,分别表示树木的数量与所需的最小木材量;第二行为由空格隔开的`N`个正整数,代表每棵树木的具体高度[^3]。 #### 输出格式 输出仅有一行,包含一个整数——满足条件的最大可能的伐木高度`H`[^4]。 #### 示例代码实现 下面给出了一种基于Python语言的解决方案,该方案利用了二分查找的思想来高效解决问题: ```python def solve_eko_problem(): N, M = map(int, input().split()) heights = [int(x) for x in input().split()] def can_obtain_enough_wood(h): total = sum(max(0, height - h) for height in heights) return total >= M low, high = 0, max(heights) result = 0 while low <= high: mid = (low + high) // 2 if can_obtain_enough_wood(mid): result = mid low = mid + 1 else: high = mid - 1 print(result) solve_eko_problem() ``` 上述程序首先读取输入数据,定义了一个辅助函数用于检验某个假设高度能否提供足够的木材。接着设置初始搜索边界,并执行标准的二分查找逻辑直到找到最优解为止[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值