贪心算法总结(未完结)

贪心的定义(摘自百度百科)

贪心算法(greedy algorithm,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解

贪心算法是以局部最优而达到全局最优,可以说贪心算法是短视的,每次只考虑当前状况下最好的选择。 

贪心并没有通用的模板和算法思路,大多时候是靠刷题积累。


区间问题

AcWing 905. 区间选点

思路分析: 

        1. 按照右端点从小到大将区间排序

        2. 依次从前往后枚举每个区间:

                1 > 若当前区间能覆盖所选点,无需操作

                2 > 若当前区间不能覆盖所选点,就选择当前区间的右端点作为新选的点,

                     同时答案要加一

代码展示:
#include <iostream>
#include <algorithm>using namespace std;const int N = 100010;
struct Edge
{int l, r;bool operator < (const Edge &W)const{return r < W.r;}
}edges[N];
int main()
{int n;cin >> n;for (int i = 0; i < n; i ++){int l, r;cin >> l >> r;edges[i] = {l, r};}sort(edges, edges + n);int res = 0, ed = -2e9;for (int i = 0; i < n; i ++){if (edges[i].l > ed){res ++;ed = edges[i].r;}}cout << res << endl;return 0;
}

AcWing 908. 最大不相交区间数量

代码展示:
#include <iostream>
#include <algorithm>using namespace std;const int N = 100010;
struct Edge
{int l, r;bool operator <(const Edge &W)const{return r < W.r;}
}edges[N];int main()
{int n;cin >> n;for (int i = 0; i < n; i ++){int l, r;cin >> l >> r;edges[i] = {l, r};}sort(edges, edges + n);int res = 0, ed = -2e9;for (int i = 0; i < n; i ++){if (edges[i].l > ed){res ++;ed = edges[i].r;}}cout << res << endl;return 0;
}

 AcWing 906. 区间分组  

思路分析:

        1. 区间按照左端点从小到大排序

        2. 用小根堆去存储每组的右端点的最大值

        3. 从前往后处理每一个区间:

                1 > 若当前区间的左端点小于堆顶,说明当前区间与前面所有组都存在交集,

                        那么就开一个新的组去存储当前区间

                2 > 若当前区间的左端点大于堆顶,说明当前区间和堆顶无交集,

                      则可以将当前区间添加到堆顶所在组中,

                      即要更新该组在小根堆中存储的右端点数值

代码展示: 
#include <iostream>
#include <algorithm>
#include <queue>using namespace std;const int N = 100010;
//按照区间左端点大小排序
struct Range
{int l, r;bool operator <(const Range &W)const{return l < W.l;}
}edges[N];int main()
{int n;cin >> n;for (int i = 0; i < n; i ++){int l, r;cin >> l >> r;edges[i] = {l, r};}sort(edges, edges + n);priority_queue<int, vector<int>, greater<int>> heap;for (int i = 0; i < n; i ++){//当前枚举的区间auto t = edges[i];//当堆中为空或者与堆顶元素有交集if (heap.empty() || heap.top() >= t.l) heap.push(t.r);else{heap.pop();heap.push(t.r);}}cout << heap.size() << endl;return 0;
}

AcWing 907. 区间覆盖

思路分析:

        1. 区间按照左端点从小到大排序

        2. 从前往后枚举每个区间(双指针算法)

                每次选取能覆盖当前点st并且右端点最大的区间,然后更新st

代码展示:
#include <iostream>
#include <algorithm>using namespace std;const int N = 100010;struct Edge
{int l, r;bool operator <(const Edge &W)const{return l < W.l;}
}edges[N];int main()
{int st, ed;cin >> st >> ed;int n;cin >> n;for (int i = 0; i < n; i ++){int l, r;cin >> l >> r;edges[i] = {l, r};}sort(edges, edges + n);int res = 0;bool flag = false;//找到能覆盖当前点的最靠右的区间,更新当前点for (int i = 0; i < n; i ++){int j = i, r = -2e9;while (j < n && st >= edges[j].l) {r = max(r, edges[j].r);j ++;}if (r < st) {res = -1;break;}res ++;if (r >= ed) {flag = true;break;}st = r;i = j - 1;}if (!flag) res = -1;cout << res << endl;return 0;
}

 Huffman树

哈夫曼树定义(摘自百度百科)

给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

哈夫曼树的构造 

每次选取最小的两个数作为两个权值相加的节点的子节点,在将该节点与未选取的值再重复操作

以一个样例来模拟这个过程:

AcWing 148. 合并果子

 思路分析:

        用小根堆来存储权值,然后构造以哈夫曼树的思路得出最终结果

代码展示:
#include <iostream>
#include <algorithm>
#include <queue>using namespace std;priority_queue<int, vector<int>, greater<int>> heap;int main()
{int n;cin >> n;while (n --){int x;cin >> x;heap.push(x);}int res = 0;while (heap.size() > 1){int a = heap.top();heap.pop();int b = heap.top();heap.pop();res += (a + b);heap.push(a + b);}cout << res << endl;return 0;
}

排序不等式

AcWing 913. 排队打水

代码展示: 

#include <iostream>
#include <algorithm>using namespace std;const int N = 100010;
typedef long long LL;int a[N];int main()
{int n;cin >> n;for (int i = 0; i < n; i ++) cin >> a[i];sort(a, a + n);LL res = 0;for (int i = 0; i < n; i ++)res += a[i] * (n - i - 1);cout << res << endl;return 0;
}

 

绝对值不等式

公式:

        | |a| - |b| | ≤ | a±b | ≤ |a| + |b|

 AcWing 104. 货仓选址

代码展示:

#include <iostream>
#include <algorithm>using namespace std;const int N = 100010;int a[N];int main()
{int n;cin >> n;for (int i = 0; i < n; i ++) cin >> a[i];sort(a, a + n);int res = 0;for (int i = 0; i < n; i ++)res += a[i] - a[i / 2];cout << res << endl;return 0;
}

 


推公式

AcWing 125. 耍杂技的牛

代码展示:

#include <iostream>
#include <algorithm>using namespace std;const int N = 100010;
typedef pair<int, int> PII;PII cow[N];int main()
{int n;cin >> n;for (int i = 0; i < n; i ++){int w, s;cin >> w >> s;cow[i] = {w + s, w};}sort(cow, cow + n);int res = -2e9, sum = 0;for (int i = 0; i < n; i ++){int w = cow[i].second, s = cow[i].first - w;res = max(res, sum - s);sum += w;}cout << res << endl;return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/175513.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.2 SSAO算法 屏幕空间环境光遮蔽

一、SSAO介绍 AO 环境光遮蔽&#xff0c;全程Ambient Occlustion&#xff0c;是计算机图形学中的一种着色和渲染技术&#xff0c;模拟光线到达物体能力的粗略的全局方法&#xff0c;描述光线到达物体表面的能力。 SSAO 屏幕空间环境光遮蔽&#xff0c;全程 Screen Space Amb…

掌握组件缓存:解开Vue.js中<keep-alive>的奥秘

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【C++】搜索二叉树

提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、搜索二叉树概念二、搜索二叉树的操作1.插入2. 查找3. 中序遍历4. 删除 三、默认成员函数1.析构函数2.拷贝构造3. 赋值运算符重载 四、完整代码 一、搜索二叉树概…

「实用技巧」后端如何使用 Eolink Apikit 快速调试接口?

程序员最讨厌的两件事&#xff1a; 写文档 别人不写文档 写文档、维护文档比较麻烦&#xff0c;而且费时&#xff0c;还会经常出现 API 更新了&#xff0c;但文档还是旧的&#xff0c;各种同步不一致的情况&#xff0c;从而耽搁彼此的时间&#xff0c;大多数开发人员不愿意写…

抽奖之星软件,可用作随机分组分班、比赛顺序抽签摇号

抽奖之星软件简介 抽奖之星&#xff0c;极品晚会抽奖软件&#xff0c;大气美观&#xff0c;功能全面&#xff0c;请安装试用或咨询客服。支持作弊内定、指定中奖人、名单分组、中奖几率。(www.wsgsoft.com/plds/) 比赛顺序抽签设置 奖项设置&#xff1a;只一个奖项即可&…

分享一下怎么做一个商城小程序

如何制作一个商城小程序&#xff1a;功能解析、设计思路与实现方法 一、引言 随着移动设备的普及和微信小程序的兴起&#xff0c;越来越多的消费者选择在商城小程序上进行购物。商城小程序具有便捷、高效、即用即走等特点&#xff0c;为企业提供了新的销售渠道和推广方式。本…

Kubernetes Taint(污点) 和 Toleration(容忍)

Author&#xff1a;rab 目录 前言一、Taint&#xff08;污点&#xff09;1.1 概述1.2 查看节点 Taint1.3 标记节点 Taint1.4 删除节点 Taint 二、Toleration&#xff08;容忍&#xff09; 前言 Kubernetes 中的污点&#xff08;Taint&#xff09;和容忍&#xff08;Toleration…

学习笔记|正态分布|图形法|偏度和峰度|非参数检验法|《小白爱上SPSS》课程:SPSS第三讲 | 正态分布怎么检验?看这篇文章就够了

目录 学习目的软件版本原始文档为什么要假设它服从正态分布呢?t检验一、图形法1、频数分布直方图解读 2、正态Q-Q图操作解读 3、正态P-P图SPSS实战操作解读 二、偏度和峰度解读&#xff1a; 三、非参数检验法注意事项 四、规范表达五、小结划重点 学习目的 SPSS第三讲 | 正态…

Shopee流量和销量不佳?或许你没有掌握正确的引流方法

很多卖家做了很久&#xff0c;但是发现流量和销量都没怎么增长&#xff0c;今天陈哥就分享一下如何正确的引流。 以下是一些有效的引流策略&#xff1a; 1. 站内引流&#xff1a;选择高性价比的潮流商品&#xff0c;根据目标客户群和重点品类进行选品。优化商品名称和描述&am…

Power BI 傻瓜入门 18. 让您的数据熠熠生辉

本章内容包括&#xff1a; 配置Power BI以使数据增量刷新发现使用Power BI Desktop and Services保护数据集的方法在不影响性能和完整性的情况下管理海量数据集 如果有更新的、更相关的数据可用&#xff0c;旧数据对组织没有好处。而且&#xff0c;老实说&#xff0c;如果数据…

设计模式_观察者模式

观察者模式 介绍 设计模式定义案例问题堆积在哪里解决办法观察者是行为型设计模式 多个对象 观察 1个对象小强考试完 成绩公布了 家长/同学得知成绩后 做出不同反应一个一个通知很麻烦 先通知谁 也有讲究的 信息发布方 抽象出一个信息管理类 负责管理监听者 类图 代码 Obse…

学习视频剪辑:如何从指定时段快速抽出视频图片!高效技巧分享

随着数字媒体的普及&#xff0c;越来越多的人开始接触视频剪辑。在视频剪辑过程中&#xff0c;有时候我们需要从指定时段快速抽出视频图片。这不仅可以帮助我们提高剪辑效率&#xff0c;还可以让我们的视频更加丰富多彩。本文将分享一些高效技巧&#xff0c;帮助你轻松实现从指…

尚未解决:use_python()和use_virtualenv()的使用

reticulate包为Python和R之间的互操作性提供了一套全面的工具。该包包含以下功能&#xff1a; 以多种方式从R调用Python&#xff0c;包括RMarkdown、获取Python脚本、导入Python模块以及在R会话中交互使用Python。 R和Python对象之间的转换&#xff08;例如&#xff0c;R和Pan…

Three.js 开发引擎的特点

Three.js 是一个流行的开源 3D 游戏和图形引擎&#xff0c;用于在 Web 浏览器中创建高质量的三维图形和互动内容。以下是 Three.js 的主要特点和适用场合&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作…

​CRM中的大客户销售是什么?​

对企业来说&#xff0c;大客户可能贡献了大部分的销售业绩。什么样的客户可以被认定为是大客户&#xff1f;大客户销售与普通销售有何区别&#xff1f;针对大客户又该采取什么样的销售策略呢&#xff1f;从回答这几个问题开始&#xff0c;我们来说说CRM中的大客户销售是什么&am…

【Postgres】Postgres常用命令

文章目录 1、导出数据库某张表2、导入某张表到数据库3、查看数据库占用磁盘页数情况4、查看数据库大小5、查看数据表大小6、查看索引大小7、对数据库中表索引按照大小排序8、对数据库中表按照大小排序9、回收空间&#xff08;建议先回收指定表&#xff09;10、设置主键自增序列…

【linux】文件系统+软硬连接+动静态库

文件系统软硬连接动静态库 1.理解文件系统1.1磁盘的物理结构1.2磁盘的存储结构1.3磁盘的逻辑结构1.4文件系统 2.软硬链接2.1什么是软硬链接2.2软硬链接的作用 3.动静态库3.1什么是库3.1静态库和静态链接3.2动态库和动态链接3.2.1通过环境变量找到动态库路径3.2.2把动态库拷贝到…

从零开始学习PX4源码0(固件下载及编译)

目录 文章目录 目录摘要1.重点学习网址2.固件下载1.下载最新版本固件2.下载之前版本固件 摘要 本节主要记录从零开始学习PX4源码1(固件下载)的过程&#xff0c;欢迎批评指正&#xff01;&#xff01;&#xff01; 下载固件主要分为两个版本&#xff0c;之前稳定版本和最新官网…

Flutter PopupMenuButton下拉菜单

下拉菜单是移动应用交互中一种常见的交互方式,可以使用下拉列表来展示多个内容标签,实现页面引导的作用。在Flutter开发中,实现下拉弹框主要有两种方式,一种是继承Dialog组件使用自定义布局的方式实现,另一种则是使用官方的PopupMenuButton组件进行实现。 如果没有特殊的…