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

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

二分答案是一种将求解最优解转化为判定问题的技巧,核心在于利用解空间的单调性进行二分查找。通过木材加工和砍树两道经典例题,演示如何构建判定函数并确定搜索边界。木材加工问题关注在满足数量要求下最大化切割长度,而砍树问题则是在获取指定木材量时最小化切割高度。两者均体现了“最大值最小”或“最小值最大”的优化模型,掌握此法可高效解决此类竞赛高频题型。

魔法巫师发布于 2026/3/23更新于 2026/7/2131 浏览
二分答案专题实战:木材加工与砍树问题解析

二分答案的核心思路

说到二分查找,大家可能更熟悉它在有序数组里找元素。但今天我们要聊的是它的进阶用法——二分答案。

二分答案准确来说,应该叫做「二分答案 + 判断」。它专门用来处理那些直接求解最优解比较困难,但验证一个解是否合法相对容易的问题。这类题目通常带有「最大值最小」或者「最小值最大」的特征。

核心在于利用解空间的单调性。如果随着某个参数(比如切割长度、机器高度)的变化,判定结果呈现出明显的二段性(即满足条件的一段区间和不满足条件的一段区间),我们就可以在这个解空间上进行二分,快速逼近最优解。

经典例题实战

1. 木材加工

问题描述 给定 N 根原木,每根长度为 $a_i$。现在需要切出 K 段等长的木料,问这 K 段木料的最大长度是多少?

解题思路 假设我们想切的长度是 x,那么对于每一根原木 $a_i$,能切出的段数就是 $ ext{floor}(a_i / x)$。把所有原木能切出的段数加起来,如果总数大于等于 K,说明 x 这个长度是可行的,甚至可能还能切得更长;反之,如果总数不够 K,说明 x 太大了,需要减小。

这里有一个细节要注意:当 x=0 时会导致除零错误,所以二分的左边界 l 至少从 1 开始。不过为了代码统一,有时也会设 l=0,在 check 函数里特判一下,或者直接设 l=1 更稳妥。

代码实现

#include <iostream>
using namespace std;

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

LL a[N], n, k;

// 计算在切割长度为 x 的情况下能切几段
LL check(LL x) {
    if (x == 0) return 0; // 防止除零
    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];
    
    // 二分范围:最小 1,最大 1e8(根据数据范围调整)
    int l = 1, r = 1e8;
    while (l < r) {
        LL mid = (l + r + 1) / 2;
        if (check(mid) >= k) l = mid;      // 可行,尝试更大的长度
        else r = mid - 1;                  // 不可行,缩小长度
    }
    cout << l << endl;
    return 0;
}

2. 砍树

问题描述 有一片森林,每棵树的高度为 $a_i$。我们需要砍伐树木获得至少 M 长度的木材。伐木机设定一个高度 H,高于 H 的部分被砍下。求 H 的最小值。

解题思路 这个问题和木材加工非常像,只是目标变成了「最小化高度」。逻辑是一样的:

  • 如果设定的高度 H 比较低,那么砍下来的木材总量 C 就会比较多。
  • 如果设定的高度 H 比较高,那么砍下来的木材总量 C 就会比较少。

这种单调关系让我们可以二分 H。如果当前高度 H 砍下来的木材够 M,说明 H 还可以再高一点(这样更省树),于是 l = mid;如果不够,说明 H 太高了,得降下来,于是 r = mid - 1。

代码实现

#include <iostream>
using namespace std;

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

LL a[N], n, m;

// 计算设定高度 mid 时能得到的木材量
LL check(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 (check(mid) >= m) l = mid;      // 木材够了,尝试更高的高度
        else r = mid - 1;                  // 木材不够,降低高度
    }
    cout << l << endl;
    return 0;
}

总结

这两道题虽然背景不同,但本质都是利用二分答案将优化问题转化为判定问题。关键点在于确认解空间的单调性,并编写高效的 check 函数。时间复杂度通常是 $O(n imes ext{log}( ext{max_val}))$,对于大规模数据也能轻松应对。掌握这个模板,遇到类似的「最大化最小值」或「最小化最大值」问题,基本就能迎刃而解了。

目录

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

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

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

更多推荐文章

查看全部
  • C++ 二叉搜索树详解:增删查改与 Key/Value 场景实现
  • 大模型 RAG 应用中的两种高级检索模式:融合检索与递归检索
  • Python Web 自动化测试实战:常用函数全解析与场景化应用指南
  • 构建 AI 临床副驾驶:基于 Go 的电子病历助手与 HIS 对接实战
  • Ubuntu 22.04 下 libwebkit2gtk-4.1-0 安装避坑指南
  • Python 快速入门指南:基础语法与环境搭建
  • 评估微调后大模型实际业务效果的性能指标有哪些
  • C++ 智能指针详解:RAII 思想与 shared_ptr 原理
  • SpringCloud 注册中心与服务注册发现 Eureka 详解
  • DeepSeek 各版本说明与优缺点分析
  • Stable Diffusion 底模 VAE 推荐与配置指南
  • 学术论文知网 AIGC 检测原理与降重实操指南
  • 前端错误处理最佳实践与策略
  • AI Agent 入门与 Coze 零代码搭建实战指南
  • VSCode Copilot 集成 DeepSeek 模型配置指南
  • 本地离线部署 Whisper 模型进行语音转写
  • C++ STL string 类从零实现详解
  • ERNIE-4.5-0.3B 轻量模型部署与能力实测指南
  • 智能家居联动与节能优化:Java大数据实战拆解
  • 强化学习与 DeepSeek-R1 训练原理详解

相关免费在线工具

  • 加密/解密文本

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