【算法通关指南:算法基础篇 】贪心专题之简单贪心:1.最大子段和 2.纪念品分组

【算法通关指南:算法基础篇 】贪心专题之简单贪心:1.最大子段和 2.纪念品分组
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人方向学习者
❄️个人专栏:《算法通关指南》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录

前言

本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长

一、贪心

贪心算法是两极分化很严重的算法。简单的问题会让你觉得理所应当,难⼀点的问题会让你怀疑人生。在解决贪心问题我们有时不仅要理解贪心策略,也要学会证明贪心策略的正确性来提高思维的严密性。

1.1 什么是贪心算法

贪心算法也称作贪心策略:企图用局部最优找出全局最优
(1)把解决问题的过程分成若干步;
(2)解决每⼀步时,都选择"当前看起来最优的"解法;
(3)希望"得到全局的最优解

1.2 贪心算法的特点

总体特点:目光短浅
(1)对于绝大多数题目,贪心策略的提出并不是很难,难的是证明它是正确的。因为贪心算法相较于暴力枚举,每一步并不是把所有情况都考虑进去,而是只考虑当前看起来最优的情况。但是局部最优并不等于全局最优,所以我们必须要能严谨的证明我们的贪心策略是正确的。⼀般证明策略有:反证法,数学归纳法,交换论证法等等
(2)当问题的场景不同时,贪心的策略也会不同。因此,贪心策略的提出是没有固定的套路和模板的。

1.3 如何学习贪心?

(1)重点放在各种各样的策略上,把各种策略当成经验来吸收;
(2)在平常学习的时候,我们尽可能的证明⼀下这个贪心策略是否正确,这样有利于培养我们严谨的思维。# 二、简单贪心的经典算法题

二、简单贪心的经典算法题

2.1 最大子段和

2.1.1题目

链接:最大子段和

在这里插入图片描述

2.1.2 算法原理

贪心想法:从前往后累加,我们会遇到下面两种情况:
(1)目前的累加和 > 0 :那么当前累加和还会对后续的累加和做出贡献,那我们就继续向后累加,然后更新结果。
(2) 目前的累加和 < 0 :对后续的累加和做不了⼀点贡献,直接大胆舍弃计算过的这⼀段,把累加和重置为0,然后继续向后累加。
这样我们在扫描整个数组⼀遍之后,就能更新出最大子段和
:考虑到如果结果可能为负数所以可以在累加过程中一边更新结果不用做过多断判断。全为负数时既为求最大值。

2.1.3代码

#include <iostream>usingnamespacestd; typedef longlong LL;constint N =2e5+10; LL a[N];intmain(){int n; cin >> n;for(int i =1; i <= n; i++) cin >> a[i];LL sum =0;LL ret =-1e20;for(int i =1; i <= n; i++){ sum += a[i]; ret =max(ret, sum);if(sum <0) sum =0;} cout << ret << endl;return0;}

2.1.4 贪心策略证明

(1)证明方法:反证法
(2)证明思路:抓住向后加的时候,只要不小于0 ,就会⼀直加下的主线去在累加的过程中算出⼀段区间和sum[a,b] < 0,如果不舍弃这⼀段,那么 [a, b]段之间就会存在⼀点,「以某个位置为起点」就会「更优」,分为下面两种情况:

2.1.4.1证明过程:

(1)情况一:在ab段存在⼀个c点 ,从这个c位置开始,「不越过 」的累加和比从a开始的累加和更优:(元素全为负数不考虑,因为全为负数时该贪心策略本身就是正确的)

在这里插入图片描述


如果存在这⼀点,那么sum[c,k] > sum[a,k],但是如果sum[c,k] > sum[a,k],那么sum[a,c −1] < 0,这与我们的贪心策略矛盾既在区间加上元素b之前,区间中任意以a为左端点的一个子区间区间和都大于0。故该情况不成立的.
(2)情况二: 在ab段存在⼀个点c ,从这个位置开始,「越过b或者刚好在b」的累加和比从a开始的累加和更优:

在这里插入图片描述


如果存在这⼀点,那么:sum[c,b] > sum[a,b],但是如果sum[c,b] > sum[a,b],那么sum[a,c −1] < 0,与我们的贪心策略矛盾既在区间加上元素b之前,区间中任意以a为左端点的一个子区间区间和都大于0。故该情况不成立的.
故证毕

2.2 纪念品分组

2.2.1题目

链接:纪念品分组

在这里插入图片描述

2.2.2 算法原理

先将所有的纪念品排序,每次拿出当前的最小 值x与最大值y:
(1)如果把x+y ≤w:就把这两个放在⼀起;
(2)如果x+y >w:说明此时最大的和谁都凑不到⼀起, y单独分组, x继续留下在进行下⼀次判断。
直到所有的物品都按照上述规则分配之后,得到的组数就是最优解

2.2.3代码

#include <iostream>#include <algorithm>usingnamespacestd;constint N =3e4+10;int a[N];intmain(){int n,w; cin >> w >> n;for(int i =1; i <= n; i++) cin >> a[i];sort(a +1, a +1+ n);int l =1, r = n;int ret =0;while(l <= r)//相遇时给物品还未分配{if(a[l]+ a[r]<= w){ l++; r--;}else r--; ret++;} cout << ret << endl;return0;}

2.2.4 贪心策略证明

(1)证明方法:交换论证法
(2)证明思路:对于区间[ai…aj],如果存在最优解但是ai与aj的分配方式与我们贪心解的分配方式不一样,我们通过调整方式调整成贪心解

2.2.4.1证明过程:

(1) a[i] + a[j] > w时:
贪心解会把a[j]单独分组,a[i]留待下次考虑.
最优解也必定会把a[j]单独分组,因为没有更小的a[i]值与a[j]组合。此时贪心解与最优解一致。
(2)a[i] + a[j] ≤ w时:
贪心解会把两者组合分在一个组里面;最优解可能有以下几种情况
情况一:◦a[j]和a[k]和一组:
▪如果a[i]单独⼀组的话,a[j] + a[k]为一组,可以调整交换a[i]和a[k],此时并不影响结,与贪心解一致
▪如果a[i]和a[l]一组的话,交换a[l]和a[k],就会变成(a[i] + a[j]),(a[l] + a[k]),总体变成a[l] + a[k] ≤ a[j] + a[k] ≤ w,不影响最终结果,和贪心解⼀致
情况二:◦a[j]单独一组:
▪如果a[i]也单独⼀组的话,最优解还不如贪心解分的组少,矛盾。
▪如果a[i]和另⼀个a[k]组的话,我们可以把a[k]和a[j]交换,此时并不影响结,与贪心解一致
总之:综上所述,我们可以通过不断的「调整」,使的最优解在「不改变其最优性」的前提下,变得和贪心解一致。

总结与每日励志

✨本文介绍了贪心算法的基本概念、特点和学习方法,重点讲解了两道经典贪心算法题:最大子段和与纪念品分组。文章通过反证法和交换论证法严谨证明了贪心策略的正确性,并提供了相应的代码实现。贪心算法通过局部最优选择寻求全局最优解,虽然策略因问题而异,但掌握其证明方法能培养严密思维。作者鼓励读者保持积极心态,相信通过不断练习和思考能够提升算法能力。

在这里插入图片描述

Read more

Flutter for OpenHarmony: Flutter 三方库 husky 守卫鸿蒙项目的 Git 提交规范(前端工程化必备)

Flutter for OpenHarmony: Flutter 三方库 husky 守卫鸿蒙项目的 Git 提交规范(前端工程化必备)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在 OpenHarmony 项目的团队协作中,我们最怕遇到“带病提交”的代码。比如:某位开发者提交的代码没经过 dart format 美化、或是包含明显的 lint 警告,甚至导致整个鸿蒙工程编译失败。如果在 CI(持续集成)阶段才发现,修复成本就太高了。 husky 是从前端生态圈引进的 Git Hooks 管理神器。它能让你极简地配置 Git 的各个钩子(如 pre-commit),在代码真正提交到远端(AtomGit)之前,强制执行格式化或单元测试,确保入库的代码永远是高质量的。 一、Git Hook 工作流模型 husky 在本地提交阶段建立了一道自动化的“安检门”。 通过 失败

By Ne0inhk
基于Rust实现爬取 GitHub Trending 热门仓库

基于Rust实现爬取 GitHub Trending 热门仓库

基于Rust实现爬取 GitHub Trending 热门仓库 这个实战项目将使用 Rust 实现一个爬虫,目标是爬取 GitHub Trending 页面的热门 Rust 仓库信息(仓库名、描述、星标数、作者等),并将结果输出为 JSON 文件。本次更新基于优化后的代码,重点提升了错误处理容错性和 CSS 选择器稳定性。 技术栈 * HTTP 请求:reqwest( Rust 最流行的 HTTP 客户端,支持异步) * HTML 解析:scraper(基于 selectors 库,支持 CSS 选择器,轻量高效) * JSON 序列化:serde + serde_json( Rust 标准的序列化

By Ne0inhk
从DeepSeek-R1爆火看开源大模型推理优化:我在脉脉找到的实战方案

从DeepSeek-R1爆火看开源大模型推理优化:我在脉脉找到的实战方案

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 文章目录: * 【前言】 * 一、场景痛点直击:两个行业的共性困境与差异化难题 * 1. 电商智能客服场景(日均请求10万+) * 2. 金融智能咨询场景(日均请求3万+) * 二、实战突破:分场景落地优化方案(附完整代码+流程图) * 1. 核心优化架构总览(流程图) * 2. 分场景核心代码实现(新增4个关键代码片段) * (1)量化分级实现(适配金融场景精度需求) * (2)多租户隔离与共享实例实现(适配电商、金融双场景) * (3)边缘节点轻量化部署代码(适配电商峰值卸载) * (4)动态批处理与负载调度优化(核心优化代码) * 3. 优化效果对比表(分场景) * 三、脉向AI核心价值:技术人破圈的“

By Ne0inhk
最新版 GLM-5 全栈实战全教程:从本地开源部署到 API 接入(多 Agent 架构 + 全栈编程 + 就业级项目实战)

最新版 GLM-5 全栈实战全教程:从本地开源部署到 API 接入(多 Agent 架构 + 全栈编程 + 就业级项目实战)

一、背景与技术概述 随着开源大模型技术的快速迭代,GLM-5 系列凭借优秀的指令遵循能力、长上下文支持、轻量化部署适配性与商用友好的开源协议,成为企业级AI落地与个人开发者技术进阶的核心选型之一。 本文以问题驱动为核心,完整覆盖从本地开源部署到工程化API封装、多Agent架构设计、全栈项目实战的全流程,解决开发者在大模型落地过程中面临的部署门槛高、工程化能力不足、Agent架构落地难、全栈项目缺乏可复用方案等核心痛点。本文所有实操步骤均经过生产环境验证,代码可直接复用,适配就业级项目的技术要求与企业落地标准。 1.1 GLM-5 核心技术特性 * 开源协议:Apache 2.0 协议,支持商用二次开发,无额外授权门槛 * 核心能力:支持128K超长上下文窗口,原生支持函数调用、多模态理解、结构化输出,指令遵循准确率较前代提升42% * 部署适配:原生支持FP8/INT4/AWQ/GPTQ多精度量化,最低可在16G显存环境完成流畅推理,适配消费级显卡与企业级GPU集群 * 性能优化:基于稀疏注意力架构与PagedAttention机制,推理吞吐量较同参数量模型提升3倍,

By Ne0inhk