【算法通关指南:算法基础篇】二分答案专题: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

《算法闯关指南:优选算法--滑动窗口》--15.串联所有单词的子串,16.最小覆盖子串

《算法闯关指南:优选算法--滑动窗口》--15.串联所有单词的子串,16.最小覆盖子串

🔥草莓熊Lotso:个人主页 ❄️个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受。 🎬博主简介: 目录 前言: 15. 串联所有单词的子串 解法(滑动窗口+哈希表): 算法思路: C++算法代码: 算法总结&&笔记展示: 16. 最小覆盖子串 解法 (滑动窗口+哈希表): 算法思路: 算法流程: C++算法代码: 初版: 优化版: 算法总结&&笔记展示: 结尾: 前言: 聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:

By Ne0inhk
【优选算法】双指针算法:专题二

【优选算法】双指针算法:专题二

目录 【611.有效三角形个数】 1、题目描述 2、实现核心及思路 解题步骤: 思路可视化: 代码实现: 【179.查找总价格为目标值的两个商品】 1、题目描述: 2、实现核心及思路: 代码实现: 【15.三数之和】 1、题目描述: 2、实现核心及思路: 解题步骤: 思路可视化: 代码实现: 【18.四数之和】 1、题目描述: 编辑2、实现核心即思路: 解题步骤: 代码实现: 【611.有效三角形个数】 1、题目描述 2、实现核心及思路 构成三角形的条件:设三角形三边长分别为a(最长边),b(最短边),c。 则有 a + b >

By Ne0inhk
优选算法——双指针专题 3.快乐数 4.盛水最多的容器

优选算法——双指针专题 3.快乐数 4.盛水最多的容器

优选算法——双指针专题 3.快乐数 4.盛水最多的容器 一.快乐数 1.题目解析 [题目传送门](202. 快乐数 - 力扣(LeetCode)) 2.原理解析 第一种情况:数最后变成1 第二种情况:无限循环但不是1 但两种都可以抽象成一种,有点像之前做过的带环链表 解法:快慢双指针 1.定义快慢指针 2.慢指针每次向后移动一步,快指针每次向后移动两步 3.判断相遇时候的值 3.代码实现 classSolution{public:intBitSum(int n)//返回每一位数上的平方和{int sum=0;while(n){int m=n%10;

By Ne0inhk
Flutter for OpenHarmony:diffutil_dart 列表差异计算引擎,高性能 UI 局部刷新的秘密武器(Myers 算法) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:diffutil_dart 列表差异计算引擎,高性能 UI 局部刷新的秘密武器(Myers 算法) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在 Flutter 开发中,我们经常遇到列表更新的场景: * 用户下拉刷新,服务器返回了新的 20 条数据,其中 18 条是旧的,2 条是新的,还有 1 条被删除了。 * 我们需要更新 ListView 或 SliverList。 直接调用 setState 重新构建整个 List 确实简单,但性能有损耗,而且会导致 Scroll 位置丢失、动画生硬。我们希望能够: * 只插入那 2 条新数据。 * 只移除那 1 条旧数据。 * 并伴随优雅的插入/移除动画(使用 AnimatedList)。 diffutil_dart 就是解决这个问题的算法库。

By Ne0inhk