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

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

二分答案适用于解决具有单调性的最优化问题,核心是将求解过程转化为判定过程。结合木材加工与砍树两道经典例题,演示如何利用二分查找确定最大切割长度或最高伐木高度。重点讲解了解空间二段性的判断方法、check 函数的构建以及二分边界的处理技巧。代码采用 C++ 实现,包含必要的类型转换与溢出防护,适合算法初学者掌握此类题型的核心逻辑与模板写法。

咸鱼开飞机发布于 2026/3/24更新于 2026/7/731 浏览
二分答案核心实战:木材加工与砍树问题详解

前言

二分答案是算法竞赛中极具技巧性的解法,核心在于将复杂求解转化为'二分 + 判定'。它专门解决「最大值最小」或「最小值最大」类问题。只要解空间具有单调性(二段性),就能通过二分快速锁定最优解。

一、二分答案原理

准确来说,这属于「二分答案 + 判断」。当解空间从小到大变化时,如果判定结果呈现「满足」到「不满足」的跳变,即可二分。我们不需要直接求出答案,而是验证某个猜测值是否可行。

二、经典例题实战

1. 木材加工

题目描述 给定 N 根原木,长度分别为 $a_1, a_2, …, a_N$。需要切成至少 K 段等长的木料,求每段的最大长度。

思路分析 假设切出的长度为 $x$,那么第 $i$ 根木头能切出 $⌊ a_i / x ⌋$ 段。总段数 $∑ ⌊ a_i / x ⌋$ 随 $x$ 增大而减小。这是一个典型的单调性问题。我们要找最大的 $x$,使得总段数 $≥ K$。

代码实现

#include <iostream>
using namespace std;

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

LL a[N], n, 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$。

思路分析 设获得木材量为 $C$。当 $H$ 增大,$C$ 减小;当 $H$ 减小,$C$ 增大。同样具备单调性。若最终结果为 $ret$,则当 $H ≤ ret$ 时 $C ≥ M$,反之 $C < M$。

代码实现

#include <iostream>
using namespace std;

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

LL a[N], n, 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

更多推荐文章

查看全部
  • 法律 NLP 实战:合同分析、文本分类与案例检索
  • ARM、AMD、Intel 架构详解
  • TRAE、Qoder、Cursor 与 Copilot:主流 AI 编程工具深度对比
  • Go 语言高性能命令行 AI 对话客户端:从环境部署到核心实现
  • AI 变现真相:为何学百种工具仍难赚钱及破局思路
  • 程序员提升编程水平的实用方法与学习路线
  • 19 款网络安全攻防演练与渗透测试在线平台精选
  • 生物医学Go编程:高性能计算与精准医疗案例分析 (一)
  • 大模型时代:为何传统机器学习仍是 AI 入门最佳路径
  • 大模型时代的爬虫新范式:基于 Prompt 的数据提取实践
  • Raphael AI:免费无限制的 AI 图像生成器
  • C++ STL 线程与互斥量:优雅解决哲学家就餐问题
  • 2025 年十大高效 AI 工具推荐,提升工作与学习效率
  • C++ STL set 与 map 容器详解
  • 2026 年主流 AI 论文写作工具盘点与使用指南
  • 深入理解 AIGC 背后的核心算法:GAN、Transformer 与 Diffusion Models
  • 统信 UOS V2500 服务器 OpenClaw AI Agent 安装部署指南
  • OpenClaw 移动端部署实战:iOS/Android 语音唤醒与离线 AI 助手
  • JavaSE 反射与动态代理
  • Java 核心面试指南:线程池、JVM 内存与垃圾回收详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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