当前位置: 首页 > news >正文

算法·贪心

文章目录

  • 贪心
    • 基本原理
    • 适用条件
  • 个人总结
    • 局部最优到全局最优
  • 贪心应用
    • 区间拆分和合并问题:
      • 区间合并问题
      • 区间重叠问题
      • 其他区间问题
      • 隐式的区间贪心
    • 哈夫曼树
    • 搭积木模型
      • 基本思路
    • 接雨水问题
  • 例题
    • 其他练习题

贪心

基本原理

  • 核心:局部最优到全局最优
  • 贪心策略:使用贪心时采取的策略

适用条件

  • 异常广泛,不需要特别注意

个人总结

贪心的精髓在于贪心策略的选取,目前已有明显的贪心策略包含:

局部最优到全局最优

  • 这里蕴含着"递进"的关系,某一范围内满足题意,不断扩大范围,直到覆盖所有范围。
  • 个人感觉这是贪心的最原始的理解。
  • U535982 J-A 小梦的AB交换:这题需要注意到两个重要事实,事实1:结果只有ABAB…和BABA…两种情况。事实2:考虑A替换的次数(B替换的次数一定与A替换的次数相等)。
  • 小苯的Z串匹配:类同。

贪心应用

区间拆分和合并问题:

  • 排序:不是两侧都可以的

  • 注意边界的更新:交集取最小边界,并集取最大边界

  • 凌乱的yyy / 线段覆盖:区间拆分问题,可以排序左端点,可以排序右端点,主要利用单调性。

区间合并问题

  • 区间合并
  • 所有的区间合并在一起,右端点保证最大,right=max(right,v[i].second),同时确保v[i].first<=right即可。

区间重叠问题

区间选点:right=min(right,v[i].second),确保多个区间始终共享重叠部分

其他区间问题

908. 最大不相交区间数量:选择区间问题,和之前区间中选一个最容易的(right最小的区间)来保证不相交即可,然后right更新回当前区间右端点即可。

voidsolve(){cin>>n;for(inti=1;i<=n;i++){inta,b;cin>>a>>b;v.push_back({a,b});}sort(v.begin(),v.end(),[&](constpr&a,constpr&b){returna.first<b.first;});intcnt=0,right=v[0].second;for(inti=1;i<v.size();i++){// 拆分区间选最小if(v[i].first>right){cnt++;right=v[i].second;}else{right=min(right,v[i].second);}}cnt++;cout<<cnt;}

907. 区间覆盖:贪心思想很直接,尽可能长的区间覆盖,然后动态更新需要保证覆盖的起始点st,确保区间内每一段内容都被覆盖。

voidsolve(){cin>>st>>ed;cin>>n;for(inti=1;i<=n;i++){inta,b;cin>>a>>b;v.push_back({a,b});}sort(v.begin(),v.end(),[&](constpr&a,constpr&b){returna.first<b.first;});intres=0,j=0;while(j<v.size()){intright=INT_MIN;while(j<v.size()&&v[j].first<=st){right=max(v[j].second,right);j++;}if(right==INT_MIN){cout<<-1;return;}res++;st=right;if(right>=ed){cout<<res;return;}}cout<<-1;}

906. 区间分组:和之前的区间的右端点进行考虑,如果满足分组条件更新当前组的右端点如果最小的右端点都不能满足条件则必须开辟新的组

  • 需要使用优先级队列来模拟动态更新的情况。
voidsolve(){cin>>n;for(inti=1;i<=n;i++){inta,b;cin>>a>>b;v.push_back({a,b});}sort(v.begin(),v.end(),[&](constpr&a,constpr&b){returna.first<b.first;});//cout << endl;//for (auto item : v) {// cout << item.first << " " << item.second << endl;//}intcnt=0;for(inti=0;i<v.size();i++){if(q.size()){if(v[i].first<=q.top()){cnt++;}else{q.pop();}}q.push(v[i].second);}cnt++;cout<<cnt;}

隐式的区间贪心




哈夫曼树

  • [NOIP2004 提高组] 合并果子:哈夫曼树问题



搭积木模型

  • 单调递增:这里的递增是从最低点开始(也就相当于假设路面铺平),需要额外填充
  • 单调递减:很容易想到不需要额外填充
  • P1969 [NOIP 2013 提高组] 积木大赛:搭积木问题
  • P5019 [NOIP 2018 提高组] 铺设道路:搭积木问题
  • 122.买卖股票的最佳时机II:

基本思路

  • 将数组几何化,本质上等价于堆积木,如果ai-1<ai,则在堆ai时顺便也完成了ai-1的工作
  • 例如堆第4列时已经完成了第3列的工作,只需要额外完成第4列多出来的工作,所以有ai-ai-1
    以下图例不是我的,引自大佬
  • ans+vec[1]是因为默认先搭建第一列,剩下所有的积木都是相对于第一列搭建的
#include<bits/stdc++.h>using namespace std;using ll=long long;int n;ll ans=0;vector<ll>vec(100009,0);voidsolve(){cin>>n;for(inti=1;i<=n;i++){cin>>vec[i];}for(inti=2;i<=n;i++){if(vec[i]>vec[i-1]){ans+=vec[i]-vec[i-1];}}cout<<ans+vec[1];}signedmain(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);solve();return0;}



接雨水问题

  • 单调队列问题 / 贪心问题。
    添加链接描述

例题

  • 【深基12.例1】部分背包问题:这道题不是0-1背包
  • 凌乱的yyy / 线段覆盖:区间拆分问题,可以排序左端点,可以排序右端点,主要利用单调性。
  • [NOIP2004 提高组] 合并果子:哈夫曼树问题
  • P1969 [NOIP 2013 提高组] 积木大赛:搭积木问题
  • P5019 [NOIP 2018 提高组] 铺设道路:搭积木问题

其他练习题

  • P3817 小A的糖果
  • P4995 跳跳!
http://www.cnnetsun.cn/news/1806263.html

相关文章:

  • AI原生DevOps流水线重构(奇点大会闭门报告节选):CI/CD→AI/CD的8项指标迁移清单
  • 揭秘2026奇点智能技术大会核心成果:如何用AI原生审查引擎将PR平均审核时长从47分钟压缩至93秒?
  • Windows任务栏个性化定制完全指南:7+ Taskbar Tweaker使用教程
  • RESTful API设计完整手册:http-api-guide最佳实践
  • LCD显示屏接口
  • 老马失前蹄,竟然在数据库外键上翻车了,重温外键级联巡
  • STC8H单片机学习-GPIO的四种模式
  • 轴承故障诊断避坑指南:东南大学数据集实战中,80%的人会忽略的GAF参数设置与模型调优细节
  • YOLOv11新版本解读:结合Phi-4-mini-reasoning分析技术演进与适用场景
  • 如何快速配置炉石传说智能脚本:新手的完整入门攻略
  • Bilibili-Evolved:终极B站增强脚本的完整指南
  • 如何免费实现PotPlayer字幕在线翻译:百度翻译插件完整指南
  • 前端可访问性:别让你的应用变成残疾人的噩梦
  • YOLOv5+DeepSORT实战:从零搭建目标检测与跟踪系统(含代码优化)
  • 【书生·浦语】internlm2-chat-1.8b在医疗健康领域应用:症状自查与报告解读
  • Cursor Pro破解全攻略:简单三步实现AI编程神器永久免费使用终极指南
  • CosyVoice语音生成大模型-300M-25Hz学术应用:配合MathType公式的理工科教学音频生成
  • RTX4090D专属Qwen-Image镜像:电商商品识别与图文问答实战
  • 5分钟极速上手:华硕笔记本终极性能控制工具G-Helper完全指南
  • 终极指南:如何用VideoSrt为视频快速生成专业字幕
  • 直驱永磁风机并网Chopper低电压穿越的Matlab Simulink仿真
  • Untrunc视频修复工具:专业恢复损坏MP4/MOV文件的终极指南
  • 【2026奇点大会权威选型白皮书】:AI原生数据库TOP5实战对比(TPC-AI基准实测+LLM推理延迟压测数据)
  • Lazarus 错误提示 “至少一个参数没有被指定值”
  • 从串口调试到数据分析:手把手教你用NAssistant玩转Nooploop TOFSense传感器
  • 数据可视化是什么?一文搞懂数据可视化技术
  • STM32单片机系统:功能集成,电力监测与远程控制
  • 告别繁琐安装!在线PPT制作神器PPTist,浏览器就能创作专业演示文稿
  • EtherCAT BRD报文实战:从0x0130/0x0131状态读取看网络拓扑发现机制
  • HackBGRT:Windows UEFI启动画面的个性化定制指南