【算法通关指南:算法基础篇】二分答案专题:1.木材加工 2.砍树

【算法通关指南:算法基础篇】二分答案专题:1.木材加工 2.砍树
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人方向学习者
❄️个人专栏:《算法通关指南 》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录


前言

二分答案是算法竞赛与笔试中极具技巧性的高分解法,核心思路是将复杂求解转化为简洁的二分+判定,专门解决「最大值最小」「最小值最大」等经典问题。本文从原理到实战,结合两道高频例题,带你从零掌握二分答案的核心逻辑与代码模板,轻松搞定同类题型。

一、二分答案

二分答案准确来说,应该叫做「二分答案 + 判断」
二分答案可以处理大部分「最大值最小」以及「最小值最大」的问题。如果「解空间」在从小到大的「变化」过程中,「判断」答案的结果出现「二段性」,此时我们就可以「二分」这个「解空间」,通过「判断」,找出最优解。

二、二分答案经典算题

2.1 木材加工

2.1.1题目

链接:
木材加工

在这里插入图片描述

2.1.2 算法原理

2.1.3 代码

//木材加工 #include <iostream> using namespace std; const int N=1e5+10; typedef long long LL;LL a[N],n,k;//计算在切割长度为x情况下切几段 LLcacl(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]; int l =0, r =1e8;while(l < r){LL mid =(l + r +1)/2;if(cacl(mid)>= k) l = mid;else r = mid -1;} cout << l << endl;return0;}

2.2 砍树

2.2.1 题目

链接:砍树

在这里插入图片描述

2.2.2 算法原理

设伐木机的高度为H ,能得到的木材为C 。根据题意,我们可以发现如下性质,:
• 当H 增大的时候,C 在减小。
• 当H 减小的时候,C 在增大。
那么在整个「解空间」里面,设最终的结果是ret ,于是有:
• 当H ≤ ret 时C>=M , 也就是「伐木机的高度」大于等于「最优高度」时,能得到的木材「大于等于」M 。
• 当H > ret 时C < M , 也就是「伐木机的高度」小于等于「最优高度」时,能得到的木材「小于」M 。

2.2.3 代码

//EKO/ 砍树 #include <iostream> using namespace std; const int N=1e6+10; typedef long long LL;LL a[N],n,m;LLcacl(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;return0;}

总结与每日励志

✨二分答案的关键,是抓住解空间的二段性,通过二分缩小范围、用判断函数验证合法性,思路清晰、效率极高。掌握这一思维,不仅能拿下算法题,更能学会用逻辑拆解难题。前路漫漫亦有收获,坚持刷题、稳步进阶,永远相信美好的事情即将发生,你付出的每一份努力,都在为更优秀的自己铺路。 永远相信美好的事情即将发生

在这里插入图片描述

Read more

《算法题讲解指南:优选算法-分治-快排》--45.数组中的第k个最大元素,46.最小的k个数

《算法题讲解指南:优选算法-分治-快排》--45.数组中的第k个最大元素,46.最小的k个数

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--优选算法 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 45.数组中的第k个最大元素 题目链接: 题目描述: 题目示例: 解法(快速选择算法): 算法思路: C++算法代码: 算法总结及流程解析: 46.最小的k个数 题目链接: 题目描述: 题目示例: 编辑 解法(快速选择算法): 算法思路: C++算法代码: 算法总结及流程解析: 结束语 45.数组中的第k个最大元素 题目链接: 215. 数组中的第K个最大元素 - 力扣(LeetCode) 题目描述: 题目示例:

By Ne0inhk
138. 随机链表的复制 - 题解与详细分析

138. 随机链表的复制 - 题解与详细分析

题目描述 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random,该指针可以指向链表中的任何节点或空节点。 构造这个链表的深拷贝。深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点。 示例 示例 1: text 输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]] 示例 2: text 输入:

By Ne0inhk
【动态规划】01背包与完全背包问题详解,LeetCode零钱兑换II秒解,轻松解力扣

【动态规划】01背包与完全背包问题详解,LeetCode零钱兑换II秒解,轻松解力扣

👨‍💻程序员三明治:个人主页 🔥 个人专栏: 《设计模式精解》《重学数据结构》 🤞先做到 再看见! 目录 * 01背包题目分析 * 01背包解决方法 * 完全背包题目分析 * 完全背包解决方法 * LeetCode 518.零钱兑换II * 思路 * 代码实现 01背包题目分析 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是O(2^n),这里的n表示物品数量。 所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化! 在下面的讲解,我举一个例子: 物品为: 重量价值物品0115物品1320物品2430 01背包解决方法 递归五部曲: 1. 确定dp数组以及下标的含义:dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,

By Ne0inhk