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

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

二分答案是一种将复杂求解转化为二分查找加判定函数的技巧,适用于解决“最大值最小”或“最小值最大”类问题。核心在于利用解空间的单调性(二段性),通过不断缩小范围找到最优解。结合木材加工与砍树两道经典例题,演示了如何构建判定函数以及处理边界条件。代码采用 C++ 实现,重点展示了二分上下界的设定与 mid 计算方式,帮助读者掌握此类题型的通用模板与思维模式。

暗影行者发布于 2026/3/15更新于 2026/9/1048 浏览
二分答案专题实战:木材加工与砍树问题详解

二分答案专题实战

图片

二分答案,准确来说应该叫做「二分答案 + 判断」。这是一种极具技巧性的高分解法,专门解决「最大值最小」「最小值最大」等经典问题。核心思路是将复杂求解转化为简洁的二分查找加判定函数。

如果解空间在从小到大的变化过程中,判断答案的结果出现二段性(单调性),此时我们就可以二分这个解空间,通过判断找出最优解。

木材加工

题目描述

链接:木材加工 (Luogu P2440)

图片

解题思路

这道题要求我们切出至少 k 段长度为 x 的木材,求 x 的最大值。随着切割长度 x 的增加,能切出的段数会减少;反之亦然。这种单调性正是二分答案的基础。

我们需要定义一个判定函数 check(x),计算当切割长度为 x 时,总共能切出多少段。如果段数大于等于 k,说明 x 可能还可以更大,尝试向右搜索;否则向左搜索。

注意边界情况,l 从 0 开始,r 设为足够大的值(如 1e8)。

代码实现

#include <iostream>
using namespace std;

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

LL a[N], n, k;

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

  {
    cin >> n >> k;
     ( i = ; i <= n; i++) cin >> a[i];

    
     l = , r = ;
     (l < r) {
        LL mid = (l + r + ) / ;
         ((mid) >= k) l = mid;
         r = mid - ;
    }
    cout << l << endl;
     ;
}
int
main
()
for
int
1
// 二分查找最大长度
int
0
1e8
while
1
2
if
cacl
else
1
return
0

砍树

题目描述

链接:砍树 (Luogu P1873)

图片

解题思路

设伐木机的高度为 H,能得到的木材总量为 C。根据题意可以发现明显的单调性质:

  • 当 H 增大时,C 减小。
  • 当 H 减小时,C 增大。

我们要找的是满足 C >= M 的最大高度 ret。这同样符合二段性:

  • 当 H <= ret 时,C >= M。
  • 当 H > ret 时,C < M。

因此,我们可以对高度 H 进行二分。判定函数中,对于每棵树,如果树高超过 H,则累加差值作为木材量。

代码实现

#include <iostream>
using namespace std;

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

LL a[N], n, m;

// 计算高度为 mid 时能得到的木材量
LL cacl(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];

    // 二分查找最大高度
    LL l = 1, r = 2e9;
    while (l < r) {
        LL mid = (l + r + 1) / 2;
        if (cacl(mid) >= m) l = mid;
        else r = mid - 1;
    }
    cout << l << endl;
    return 0;
}

总结

二分答案的关键,是抓住解空间的二段性,通过二分缩小范围、用判断函数验证合法性。掌握这一思维,不仅能拿下算法题,更能学会用逻辑拆解难题。在实际刷题中,注意上下界的设定和 mid 的计算方式,避免死循环或越界。

目录

  1. 二分答案专题实战
  2. 木材加工
  3. 题目描述
  4. 解题思路
  5. 代码实现
  6. 砍树
  7. 题目描述
  8. 解题思路
  9. 代码实现
  10. 总结

更多推荐文章

查看全部
  • HTML5 Web Workers 详解:提升网页性能的关键技术
  • VsCode 远程连接服务器后 Github Copilot 无法使用修复
  • Web3 技术栈详解:五层架构与核心原理
  • Python 拒绝采样算法优化与多峰分布模拟实战
  • Figma + Claude + Weavy AI 协同设计工作流实践
  • 2026 年 Web 前端开发的 8 大技术趋势
  • ChatGPT 到 AI 大模型私有化部署:企业技术选择分析
  • FPGA 跨时钟域 CDC 处理的 3 种常用工程方案
  • Windows 下使用 VS Code 搭建 Go 开发环境及工具链原理
  • Spring Boot 中 MultipartFile 的单元测试实战
  • AIGC 自动化编程实践:基于 ChatGPT 与 GitHub Copilot 阅读笔记
  • 飞算 JavaAI 辅助 Java 项目开发流程与效率提升实践
  • Clawdbot 接入飞书机器人的配置记录
  • 国内如何升级 GitHub Copilot 到专业版
  • 无线联邦学习:保护隐私下的 AI 协同进化
  • OpenClaw 接入自定义模型并通过 WebUI 实现智能操作
  • openGauss 实战指南:gsql 命令、认证配置与运维工具详解
  • 绿联云 NAS 配置 WebDAV 实现公网同步
  • MacOS 下基于 Docker 部署 OpenClaw 并集成飞书机器人教程
  • ToClaw 评测:AI 数字助理应重在任务执行而非单纯聊天

相关免费在线工具

  • 加密/解密文本

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