跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

二分答案专题实战:木材加工与砍树问题详解

二分答案是一种针对解空间进行二分查找的技巧,核心在于利用单调性将复杂求解转化为简洁的二分加判定过程。本文结合木材加工与砍树两道高频算法题,演示如何通过设定候选值并验证可行性,高效解决最大值最小化或最小值最大化问题。重点讲解了 check 函数的构建逻辑及二分边界的处理细节,帮助读者掌握此类问题的通用解法。

山野来信发布于 2026/3/26更新于 2026/8/2236 浏览
二分答案专题实战:木材加工与砍树问题详解

二分答案专题实战:木材加工与砍树问题详解

一、二分答案核心思路

二分答案并非直接对数组进行二分,而是针对解空间进行二分。其本质是「二分答案 + 判定」。当问题的解具有单调性(即随着答案增大,判定结果呈现二段性)时,我们可以利用二分查找来快速定位最优解。这类方法特别适用于解决「最大值最小」或「最小值最大」的问题。

在实际应用中,我们不需要知道具体的解是什么,只需要判断某个候选值是否满足条件。如果满足,就尝试更大的范围;如果不满足,则缩小范围。这种思路能显著降低时间复杂度。

二、经典例题解析

1. 木材加工

题目描述 给定 $n$ 根原木,长度分别为 $a_1, a_2, \[dots], a_n$。需要切割出至少 $k$ 段长度为 $x$ 的木材。求 $x$ 的最大值。

解题思路 假设我们要切出的长度为 $mid$,那么每根原木能切出的段数是 $\lfloor a_i / mid \rfloor$。如果所有原木切出的总段数大于等于 $k$,说明 $mid$ 这个长度可行,可以尝试更大的长度;否则需要减小长度。 这里存在明显的单调性:长度越小,能切出的段数越多。因此可以使用二分查找。

代码实现

#include <iostream>
using namespace std;

const int N = 1e5 + 10;
typedef long long LL;

LL a[N];
int n;
LL k;

// 计算在切割长度为 x 的情况下能切几段
LL calc(LL x) {
    LL cnt = 0;
    for (int i = 1; i <= n; i++) {
        cnt += a[i] / x;
    }
    return cnt;
}

int main() {
    cin >> n >> k;
    for (int i = 1; i <= n; i++) cin >> a[i];

    // 二分范围:左边界为 0,右边界设为一个足够大的值(如 1e8)
    int l = 0, r = 1e8;
    while (l < r) {
        LL mid = (l + r + 1) / 2;
        if (calc(mid) >= k) l = mid;      // 可行,尝试更大
        else r = mid - 1;                 // 不可行,减小
    }
    cout << l << endl;
    return 0;
}

2. 砍树

题目描述 有 $n$ 棵树,高度为 $a_i$。伐木机设定高度为 $H$,高于 $H$ 的部分被锯下。要求锯下的木材总量至少为 $m$。求 $H$ 的最大值。

解题思路 设最终结果为 $ret$。

  • 当 $H \le ret$ 时,得到的木材量 $C \ge m$(高度越低,锯得越多)。
  • 当 $H > ret$ 时,得到的木材量 $C < m$(高度越高,锯得越少)。 同样具备二段性,可以通过二分高度 $H$ 来求解。

代码实现

#include <iostream>
using namespace std;

const int N = 1e6 + 10;
typedef long long LL;

LL a[N];
int n;
LL m;

// 计算设定高度 mid 时能得到的木材总量
LL calc(LL mid) {
    LL ret = 0;
    for (int i = 1; i <= n; i++) {
        if (a[i] - mid > 0) ret += a[i] - mid;
    }
    return ret;
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> a[i];

    // 二分范围:高度从 1 到 2e9
    LL l = 1, r = 2e9;
    while (l < r) {
        LL mid = (l + r + 1) / 2;
        if (calc(mid) >= m) l = mid;      // 满足需求,尝试更高
        else r = mid - 1;                 // 不满足,降低高度
    }
    cout << l << endl;
    return 0;
}

三、总结

二分答案的关键在于识别解空间的单调性。一旦确认了「答案变大,判定结果变好/变坏」的规律,就可以套用模板。这两道题虽然场景不同,但核心逻辑一致:通过二分缩小搜索范围,用线性扫描验证可行性。掌握这一思维,面对类似的最优化问题时就能迎刃而解。

目录

  1. 二分答案专题实战:木材加工与砍树问题详解
  2. 一、二分答案核心思路
  3. 二、经典例题解析
  4. 1. 木材加工
  5. 2. 砍树
  6. 三、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Boston Dynamics(波士顿动力)机器人进化史
  • 基于 PSO-DWA 融合的无人机三维动态避障路径规划研究 (Matlab 实现)
  • Fooocus 部署实践:本地手动配置与云端一键启用对比
  • NestJS 核心揭秘:InstanceWrapper 的艺术与前端缓存新思路
  • 使用 OpenClaw 在飞书搭建专属 AI 机器人
  • 快手 M3CSR:多模态短视频冷启动推荐方法
  • KIMI 与文心一言、通义千问大模型能力对比评测
  • 线性 DP 经典四题详解:台阶、子段和、传球与乌龟棋
  • 大模型应用中的 Prompt 提示词管理与优化实践
  • 一人一周重构开源官网:Qoder + Skills 实战
  • Spring Cloud Sentinel 熔断降级核心原理与实战指南
  • Llama 3-8B-Instruct 在昇腾 NPU 上基于 SGLang 的性能实测
  • JVS-APS:算法驱动与低代码融合的智能排产方案
  • OpenClaw 安装百度网页搜索技能 (baidu-web-search)
  • Open-WebUI 管理员面板功能详解与配置指南
  • WebAssembly 技术全景解析:核心机制与应用场景
  • Llama-Factory 微调常见错误与解决方案
  • AI 大模型在短视频处理和剪辑中的应用
  • Vue 3 异步组件架构:defineAsyncComponent、import.meta.glob 与 Suspense 实战
  • ASP.NET 4.7 微服务化实践:Windows Docker 环境搭建

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online