贪心算法总结(未完结)

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

贪心算法(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.mzph.cn/news/122547.shtml

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

相关文章

Hive常用DDL操作

本专栏案例数据集链接: https://download.csdn.net/download/shangjg03/88478038 1. Database 1.1 查看数据库列表 show databases; 1.2 使用数据库 USE database_name;

设计模式(2)-创建型模式

1&#xff0c;创建型模式 4.1 单例设计模式 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己…

有所期待的日子,就是幸福的。

打开了手机屏幕&#xff0c;开始码字&#xff0c;手指敲打出文字的霎那&#xff0c;像是高中时期最后一节晚自习时抬起的笔&#xff0c;在厚厚的日记本上&#xff0c;写下一段时间的感受。文字是有力量的&#xff0c;我从来都相信。 大三那年&#xff0c;我总是会习惯而又阶段…

初次学习dubbo记录

---------------------------------------10.17---------------------------------------- 集群和分布式概念 集群&#xff1a;很多"人"做的相同的一件事&#xff0c;即使有一个人挂掉了&#xff0c;也不会对系统造成致命影响 分布式&#xff1a;很多"人"…

ruoyi vue前后端分离功能介绍

文章目录 内置功能:用户管理&#xff1a;部门管理&#xff1a;岗位管理&#xff1a;菜单管理&#xff1a;角色管理&#xff1a;字典管理&#xff1a;参数管理&#xff1a; 可以设置是否开启验证码功能通知公告&#xff1a;操作日志&#xff1a;登录日志&#xff1a;在线用户&am…

Think-Queue3一直提示[Exception]redis扩展未安装

场景 tp6tq3实现的任务队列&#xff0c;使用redis作为数据驱动&#xff0c;目前是tp6可以正常使用redis了&#xff0c;但tq3不行&#xff0c;一直提示[Exception]redis扩展未安装。 解决思路 1.分析tq3源码 定位到是这一行出了问题 if (!extension_loaded(redis)) {throw n…

PAT 乙级1070结绳

题目&#xff1a; 给定一段一段的绳子&#xff0c;你需要把它们串成一条绳。每次串连的时候&#xff0c;是把两段绳子对折&#xff0c;再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子&#xff0c;可以再次对折去跟另一段绳子串连。每次串连后&#xff0c;原来两…

【ChatGPT系列】ChatGPT:创新工具还是失业威胁?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

香港服务器如何做负载均衡?

​  在现代互联网时代&#xff0c;随着网站访问量的不断增加&#xff0c;服务器的负载也越来越重。为了提高网站的性能和可用性&#xff0c;负载均衡成为了一种常见的解决方案。 什么是负载均衡? 负载均衡是一种技术解决方案&#xff0c;用于在多个服务器之间分配负载&#…

【C】想练习C语言?通讯录的实现了解一下

目录 实现思路 开始实现 添加增加联系人功能 添加显示联系人信息的功能 添加删除联系人功能 添加查找指定联系人的功能 添加修改指定联系人的功能 测试 代码 Test.c Contact.c Contact.h 实现思路 1.通讯录中保存人的信息&#xff1a;名字、年龄、性别、电话、住址…

音视频常见问题(六):视频黑边或放大

摘要 本文介绍了视频黑边或放大的原因和解决方案。主要原因包括视频分辨率与显示视图尺寸不一致、摄像头采集、美颜滤镜格式兼容和分辨率。为了解决这些问题&#xff0c;开发者可以选择合适的渲染模式、动态调整分辨率、处理视频旋转和使用自定义视频渲染。 即构音视频SDK提供…

每日一道算法题:26. 删除有序数组中的重复项

难度 简单 题目 给你一个 非严格递增排列 的数组 nums &#xff0c;请你原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为…

Winform 多语言化快速解析替换工具-1分钟一个界面

随着业务的扩展&#xff0c;有的软件有多语言化的需求。那么如果软件已经很多写死的文字内容如何快速进行语言化替换呢&#xff0c;一个一个去改工作量太大。 于是开发了个小工具用来替换现有内容并生成语音包&#xff0c;原理就是采用正则表达式进行匹配控件关键字以及中文进…

基础数据类型和引用数据类型区别?

基础数据类型和引用数据类型的区别如下&#xff1a; 存储上的区别&#xff1a;基础数据类型是存放在栈中的简单数据段&#xff1b;引用数据类型是存放在堆内存中的对象&#xff0c;在栈内存中存放的是堆内存中具体内容的引用地址&#xff0c;通过这个地址可以快速查找到对象。…

AS/400简介

AS400 AS400 简介AS/400操作系统演示 AS400 简介 在 AS400 中&#xff0c;AS代表“应用系统”。它是多用户、多任务和非常安全的系统&#xff0c;因此用于需要同时存储和处理敏感数据的行业。它最适合中级行业&#xff0c;因此用于制药行业、银行、商场、医院管理、制造业、分销…

基于长短期神经网络的可上调容量PUP预测,基于长短期神经网络的可下调容量PDO预测,LSTM可调容量预测

目录 背影 摘要 代码和数据下载:基于长短期神经网络的可上调容量PUP预测,基于长短期神经网络的可下调容量PDO预测,LSTM可调容量预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88230834 LSTM的基本定义 LSTM实现的步骤 基于长短…

使用FastAPI部署Ultralytics YOLOv5模型

YOLO是You Only Look Once(你只看一次)的缩写&#xff0c;它具有识别图像中的物体的非凡能力&#xff0c;在日常应用中会经常被使用。所以在本文中&#xff0c;我们将介绍如何使用FastAPI的集成YOLOv5&#xff0c;这样我们可以将YOLOv5做为API对外提供服务。 Python有几个web框…

CGAL+QT

先安装CGAL和QT 安装完QT其中MSVC 这两个没配置 1、x32配置选择的是 x64配置选择的是 2、CGAL 5.4.5 - Manual: Using CGAL on Windows (with Visual C) 参数文章配置一些环境变量 3、 测试 新建build 进行cmake QT、Boost、CGAL都自动匹配上了&#xff08;环境变量已经配…

FastAPI框架学习笔记(快速入门FastAPI框架)

1. 写在前面 今天整理一篇后端框架的笔记&#xff0c; fastapi框架是比较主流的后端异步web框架&#xff0c;关键是python语言可以写&#xff0c;正好公司最近安排了一些后端服务的活&#xff0c; 所以就看了一个fastapi框架的入门课程(链接在底部)&#xff0c;完成任务&#…

lua-web-utils和proxy设置示例

以下是一个使用lua-web-utils和proxy的下载器程序&#xff1a; -- 首先安装lua-web-utils库 local lwu require "lwu" ​ -- 获取服务器 local function get_proxy()local proxy_url "duoipget_proxy"local resp, code, headers, err lwu.fetch(proxy_…