贪心算法总结(未完结)

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

贪心算法(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.mfbz.cn/a/107335.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter 接口测试,参数值为列表,如何参数化?

最近在我的教学过程中&#xff0c;我的一个学生问了我一个问题&#xff0c;他们公司的一个接口参数值是列表&#xff0c;列表中值的数量有多有少&#xff0c;问我在 jmeter 中如何让这个参数的值进行参数化&#xff1f; 看到这种问题&#xff0c;你的第一反应是什么&#xff1f…

mysql-面试50题-2

一、查询数据 学生表 Student create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10)); insert into Student values(01 , 赵雷 , 1990-01-01 , 男); insert into Student values(02 , 钱电 , 1990-12-21 , 男); insert into Student v…

如何理解my_map.yaml中origin的含义

当然可以。首先,我们先了解一下2D地图的基本构成。2D地图实际上是一个网格系统,其中每个单元格(或像素)代表现实世界中的一个区域。当我们谈论origin时,我们实际上是在描述这个网格如何在真实的3D空间中放置。 让我们通过一个简单的示意图来解释: 假设上面的矩形表示一个…

【可变形注意力(1)】Multi-scale Deformable Attention Transformers 多尺度变形注意力

文章目录 前言论文 《Deformable DETR: Deformable Transformers for End-to-End Object Detection》的多尺度变形注意力的解读DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION **2.** Deformable Attention ModuleDeformable Attention Module 3. Multi-Scale Defor…

【开源】基于SpringBoot的森林火灾预警系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟雾传感器模块2.4 温度传感器模块2.5 历史记录模块2.6 园区数据模块 三、系统设计3.1 用例设计3.1.1 森林园区基础系统用例设计3.1.2 森林预警数据用例设计 3.2 数据库设计3.2.1 烟雾…

C# | Chaikin算法 —— 计算折线对应的平滑曲线坐标点

Chaikin算法——计算折线对应的平滑曲线坐标点 本文将介绍一种计算折线对应的平滑曲线坐标点的算法。该算法使用Chaikin曲线平滑处理的方法&#xff0c;通过控制张力因子和迭代次数来调整曲线的平滑程度和精度。通过对原始点集合进行切割和插值操作&#xff0c;得到平滑的曲线坐…

【原创】解决Kotlin无法使用@Slf4j注解的问题

前言 主要还是辟谣之前的网上的用法&#xff0c;当然也会给出最终的使用方法。这可是Kotlin&#xff0c;关Slf4j何事&#xff01;&#xff1f; 辟谣内容&#xff1a;创建注解来解决这个问题 例如&#xff1a; Target(AnnotationTarget.CLASS) Retention(AnnotationRetentio…

开源Linux社区Armbian开发指南

1. 什么是armbian Armbian是一个基于Debian或Ubuntu的开源操作系统&#xff0c;专门针对嵌入式ARM平台进行优化和定制。Armbian可以运行在多种不同的嵌入式设备上&#xff0c;例如树莓派、ArmSoM、香蕉派等等。Armbian针对不同的嵌入式平台&#xff0c;提供了相应的硬件支持&a…

利用HTTP2,新型DDoS攻击峰值破纪录

亚马逊、Cloudflare 和谷歌周二联合发布消息称&#xff0c;一种依赖于 HTTP/2 快速重置技术的攻击行为对它们造成了破纪录的分布式拒绝服务 (DDoS) 攻击。 根据披露的信息&#xff0c;该攻击自8月下旬以来便一直存在&#xff0c;所利用的漏洞被跟踪为CVE-2023-44487&#xff0c…

基于SpringBoot+Vue的服装销售系统

基于SpringBootVue的服装销售平台的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 我的订单 登录界面 管理员界面 摘要 基于SpringBoot和Vue的服装销售系统…

管理类联考——数学——汇总篇——知识点突破——数据分析——记忆

文章目录 考点记忆/考点汇总——按大纲 整体目录大纲法记忆宫殿法绘图记忆法 局部数字编码法对号不对号 归类记忆法重点记忆法歌决记忆法口诀&#xff1a;加法分类&#xff0c;类类相加&#xff1b;乘法分步&#xff0c;步步相乘。 谐音记忆法涂色 理解记忆法比较记忆法转图像记…

Qwt开发环境搭建(保姆级教程)

1.简介 QWT&#xff0c;即Qt Widgets for Technical Applications&#xff0c;其目标是以基于2D方式的窗体部件来显示数据&#xff0c; 数据源以数值&#xff0c;数组或一组浮点数等方式提供&#xff0c; 输出方式可以是Curves&#xff08;曲线&#xff09;&#xff0c;Slider…

计算机毕设 opencv 图像识别 指纹识别 - python

文章目录 0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测 4 OpenCV5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…

liunx Centos-7.5上 rabbitmq安装

在安装rabbitmq中需要注意&#xff1a; 1、rabbitmq依赖于erlang&#xff0c;需要先安装erlang 2、erlang和rabbitmq版本有对应关系 可参考网页&#xff1a;https://www.rabbitmq.com/which-erlang.html 第一步&#xff0c;安装编译工具及库文件,如果服务器上已经有了&…

如何在vscode中添加less插件

Less &#xff08;Leaner Style Sheets 的缩写&#xff09; 是一门向后兼容的 CSS 扩展语言。它对CSS 语言增加了少许方便的扩展&#xff0c;通过less可以编写更少的代码实现更强大的样式。但less不是css&#xff0c;浏览器不能直接识别&#xff0c;即浏览器无法执行less代码&a…

【mediasoup-sfu-cpp】3: SfuDemo:加入会议首次成功运行

【mediasoup-sfu-cpp】2:SfuCppDemo 和MediaSoup实例 可以发现闫华大神的demo是开箱即用的。虽然客户端的demo 未开源,但是是可以测试的。正确加入后应该就是发布了视频的 加入会议后默认开启camera,ID 是自己填写的,代表UID demo自己随机生成就可以。 配置本地服务地址 ws…

场效应管器件

在面试硬件方面的工作时&#xff0c;我们通常会被提问模电方面的知识。 场效应管简称FET,有三级&#xff1a;源极(S)、漏极(D)、栅极&#xff08;G&#xff09;&#xff1b;可以实现电压控制电流源&#xff1b;“源极和漏极之间的漏极电流Id&#xff0c;由栅极的负电压进行控制…

轻量级仿 Spring Boot=嵌入式 Tomcat+Spring MVC

啥&#xff1f;Spring Boot 不用&#xff1f;——对。就只是使用 Spring MVC Embedded Tomcat&#xff0c;而不用 Boot。为啥&#xff1f;——因为 Boot 太重了&#xff1a;&#xff09; 那是反智吗&#xff1f;Spring Boot 好好的就只是因为太重就不用&#xff1f;——稍安勿…

刀片式服务器介绍

大家都知道服务器分为机架式服务器、刀片式服务器、塔式服务器三类&#xff0c;今天小编就分别讲一讲这三种服务器&#xff0c;第二篇先来讲一讲刀片式服务器的介绍。 刀片式服务器定义&#xff1a;是一种高密度的服务器架构&#xff0c;通过多个独立服务器单元组成&#xff0c…

windows qemu安装飞腾Aarch64 操作系统 亲测

在win7&#xff08;X86架构CPU&#xff09;下使用QEMU虚拟机运行银河麒麟操作系统&#xff08;ARM架构CPU&#xff09; 1、下载并安装QEMU虚拟机软件 https://qemu.weilnetz.de/w64/2020/ 2、准备好ARM银河麒麟操作系统.iso文件 这里是 Kylin-Desktop-V10-Release-2107-ar…