AcWing算法学习笔记:贪心(区间问题 + Huffman树 + 排序不等式 + 绝对值不等式 + 推公式)

贪心

  • 一、区间问题
    • ①区间选点
    • ②最大不相交区间数量
    • ③区间分组
    • ④区间覆盖
  • 二、Huffman树(合并果子)
  • 三、排序不等式(排队打水)
  • 四、绝对值不等式(货仓选址)
  • 五、推公式(耍杂技的牛)

一、区间问题

①区间选点

算法
将所有区间的右端点从小到大排序
遍历所有的区间
若该区间内没有点(左端点大于标记值),则将该区间的右端点设为新的标记值,并且点数加一
若这个区间有点,则不处理,跳过该区间
代码

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010;struct Range
{int l, r;bool operator<(const Range &w){return r < w.r;}
}range[N];int main()
{int n;cin >> n;for (int i = 0; i < n; i ++){int a, b;cin >> a >> b;range[i] = {a, b};}sort(range, range + n);int p = -2e9;int res = 0;for (int i = 0; i < n; i ++){if (range[i].l > p){res ++;p = range[i].r;}}cout << res;return 0;
}

②最大不相交区间数量

该题的算法与代码同上

③区间分组

算法
将所有区间按照左端点从小到大排序
遍历所有的区间
使用小根堆存储每个组最后一个区间的右端点值
如果当前区间的左端点 <= 堆中最小右端点
说明该区间不能放进任何一个分组,则将这个区间加入堆(新开一组)
如果当前区间左端点 > 堆中最小右端点
说明该区间能够放进任意一个组中,则将其放入右端点最小的组
将右端点最小的组的右端点更新
代码

#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>using namespace std;const int N = 100010;struct Range
{int l, r;bool operator<(const Range &w){return l < w.l;}
}range[N];int main()
{int n;cin >> n;for (int i = 0; i < n; i ++){int a, b;cin >> a >> b;range[i] = {a, b};}sort(range, range + n);priority_queue <int, vector<int>, greater<int>> heap;int p = -2e9;for (int i= 0; i < n; i ++){if (heap.empty() || heap.top() >= range[i].l){heap.push(range[i].r);}else{heap.pop();heap.push(range[i].r);}}cout << heap.size();return 0;
}

④区间覆盖

算法
将所有区间按照左端点从小到大进行排序
遍历所有的区间
寻找覆盖st的所有区间中右端点最大的区间
并将该区间的右端点更新st,区间数量加一
若没有找到能够覆盖st的区间,则无解
若最后区间没有被覆盖完,则无解
代码

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010;struct Range
{int l, r;bool operator<(const Range &w){return l < w.l;}
}range[N];int main()
{int st, ed;cin >> st >> ed;int n;cin >> n;for (int i = 0; i < n; i ++){int a, b;cin >> a >> b;range[i] = {a, b};}sort(range, range + n);bool f = false;int res = 0;for (int i = 0; i < n; i ++){int p = -2e9;int j = i;while (j < n && range[j].l <= st){p = max(p, range[j].r);j ++;}if (p < st){break;}if (p >= st){st = p;res ++;}if (p >= ed){f = true;break;}i = j - 1;}if (f) cout << res;else cout << -1;return 0;
}

二、Huffman树(合并果子)

算法
每次选取最小的两个数字进行合并
代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;const int N = 10010;int main()
{int n;cin >> n;priority_queue <int, vector <int>, greater<int>> heap;for (int i = 0; i < n; i ++){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;return 0;
}

三、排序不等式(排队打水)

算法
根据打水时间从小到大排队,即总的等待时间最短
代码

#include <iostream>
#include <algorithm>
#include <cstring>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);long long res = 0;for (int i = 0; i < n; i ++) res += a[i] * (n - i - 1);cout << res;return 0;
}

四、绝对值不等式(货仓选址)

算法
如果有奇数个仓库,那么将地址选在中间那个仓库点就是距离最近的
如果有偶数个仓库,那么将地址选在中间两个仓库间的任何一点都是最近的
综上,选在n/2这个点即可涵盖上述两种情况
代码

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010;
int a[N];
int n;int main()
{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 += abs(a[i] - a[n / 2]);cout << res;return 0;
}

五、推公式(耍杂技的牛)

算法
题目要考虑如何排序使得答案最小,可以尝试交换其中两头牛的位置
看看答案有什么影响,得出其中的公式,得到最优解
在这里插入图片描述

根据w + s 从小到大进行排序,得到的最大的风险系数最小
代码

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;
typedef pair <int, int> PII;
const int N = 50010;PII a[N];int main()
{int n;cin >> n;for (int i = 0; i < n; i ++){int w, s;cin >> w >> s;a[i] = {w + s, s}; //第二个关键字是能力或体重都可以}sort(a, a + n);int res = -2e9, sum = 0;for (int i = 0; i < n; i ++){int s = a[i].second, w = a[i].first - s;res = max(res, sum - s);sum += w;}cout << res;return 0;
}

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

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

相关文章

常见API

文章目录 Math类1.1 概述1.2 常见方法 System类2.1 概述2.2 常见方法 Runtime3.1 概述3.2 常见方法 Object类4.1 概述4.2 常见方法 Objects类5.1 概述5.2 常见方法 BigInteger类6.1 引入6.2 概述6.3 常见方法6.4 底层存储方式&#xff1a; 7 BigDecimal类7.1 引入7.2 概述7.3 常…

leetcode 1.两数之和(C++)DAY1(待补充哈希表法)

文章目录 1.题目描述示例提示 2.解答思路3.实现代码结果4.总结 1.题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&…

猫用空气净化器真的能除菌吗?除毛可以用宠物空气净化器吗?

猫咪给我们带来了无尽的欢乐&#xff0c;但它们换毛时家里到处都是猫毛。我们会在地板、沙发上发现一大堆&#xff0c;甚至衣服也难逃其影响。这些浮毛中可能携带着微生物和尘螨等。对于免疫力较低的老年人、孩子和孕妇来说&#xff0c;他们更容易感染这些微生物。而对于鼻炎患…

openlayers加载天地图

申请天地图key 官方&#xff1a;https://www.tianditu.gov.cn/ 申请key&#xff1a;https://sso.tianditu.gov.cn/login?servicehttps%3A%2F%2Fconsole.tianditu.gov.cn%2F 进去之后&#xff0c;先登录&#xff0c;如果没账号先注册一个就行。 可以创建个应用&#xff0c;…

Unity制作随风摇摆的植物

今天记录一下如何实现随风摇摆的植物&#xff0c;之前项目里面的植物摇摆实现是使用骨骼动画实现的&#xff0c;这种方式太消耗性能&#xff0c;植物这种东西没必要&#xff0c;直接使用顶点动画即可。 准备 植物不需要使用标准的PBR流程&#xff0c;基础的颜色贴图加上法向贴…

153基于matlab的滚动轴承故障诊断

基于matlab的滚动轴承故障诊断&#xff0c;基于小波包分解&#xff0c;得到数据峭度值&#xff0c;以正常与故障数据峭度差值进行最大尺度重构&#xff0c;对重构信号进行包络谱分析。程序已调通&#xff0c;可直接运行。 153matlab 信号重构 包络谱分析 故障诊断 (xiaohongshu…

网络流数据集处理(深度学习数据处理基础)

一、数据集处理 处理数据集是一个文件夹 一个文件夹处理的&#xff0c;将原网络流数据集 放入一个文件夹 处理转换成 Json文件。&#xff08;数据预处理&#xff09;然后将这些文件处理成目标文件格式 再分割成训练集和测试集。每次运行只会处理一个文件夹。 运行train.py 导入…

html,css,js速成

准备&#xff1a;vscode配好c&#xff0c;python&#xff0c;vue环境&#xff0c;并下载live server插件。 1. html hypertext markup language(超文本标记语言) 1. 基础语法 一个html元素由开始标签&#xff0c;填充文本&#xff0c;结束标签构成。 常见标签说明<b>…

VC++中使用OpenCV绘制直线、矩形、圆和文字

VC中使用OpenCV绘制直线、矩形、圆和文字 在VC中使用OpenCV绘制直线、矩形、圆和文字非常简单&#xff0c;分别使用OpenCV中的line、rectangle、circle、putText这四个函数即可。具体可以参考OpenCV官方文档&#xff1a;https://docs.opencv.org/4.x/index.html 下面的代码展…

微信小程序实现时间轴效果

目录 引言时间轴效果的应用场景微信小程序的优势时间轴效果的设计思路时间轴界面布局数据结构设计实现时间轴效果WXML结构设计WXSS样式设计JavaScript逻辑实现说明引言 时间轴效果的应用场景 时间轴效果作为一种独特且直观的信息展示形式,已经被广泛应用于各种场景中,提供了…

【EI会议征稿通知】第四届光学与图像处理国际学术会议(ICOIP 2024)

第四届光学与图像处理国际学术会议&#xff08;ICOIP 2024&#xff09; 2024 4th International Conference on Optics and Image Processing 光学器件的实用化、图像处理的更优化等话题深受国内外专家、学者们关注。为推动光学与图像处理的发展&#xff0c;促进该领域学术交…

Flutter 和 Android原生(Activity、Fragment)相互跳转、传参

前言 本文主要讲解 Flutter 和 Android原生之间&#xff0c;页面相互跳转、传参&#xff0c; 但其中用到了两端相互通信的知识&#xff0c;非常建议先看完这篇 讲解通信的文章&#xff1a; Flutter 与 Android原生 相互通信&#xff1a;BasicMessageChannel、MethodChannel、…

命名空间(namespace)及其应用技巧

C 命名空间及其应用技巧 文章目录 C 命名空间及其应用技巧引言代码案例一&#xff1a;不同命名空间的变量和自定义类型代码案例二&#xff1a;命名空间的嵌套和using的使用代码案例三&#xff1a;不连续的同名命名空间代码案例四&#xff1a;命名空间和局部、全局变量的优先级总…

使用Ettus USRP X440对雷达和EW系统进行原型验证

概览 无论是保障己方平台的生存能力&#xff0c;还是扰乱敌方频谱使用&#xff0c;以电磁(EM)频谱为主导都是任务成功的主要因素。电磁频谱操作(Electromagnetic Spectrum Operation, EMSO)需要使用战术系统来监测敌方的频谱活动、定位其发射器并帮助己方制定行动计划。软件无…

大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置

上一篇&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 目录 1. &#x1f959;Idea中配置Live Templates来快速生成代码片段 2. &#x1f959;Idea中配置文件模板自定义初始代码 3.&#x1f959;设置spark-submit提交程…

【stm32】hal库学习笔记-FSMC连接TFT_LCD

【stm32】hal库学习笔记-FSMC连接TFT LCD 触摸屏结构与原理 LCD模块接口原理图 LCD 接口连接在 FSMC 总线上面&#xff0c;图中的 T_MISO/T_MOSI/T_PEN/T_SCK/T_CS 连接在 MCU 的 PB2/PF11/PB1/PB0/PC13 上&#xff0c;这些信号用来实现对液晶触摸屏的控制&#xff08;支持电阻…

AI 数字人从制作到变现

最近AI很火&#xff0c;无意中发现一个宝藏专栏《AI数字人从制作到变现》&#xff0c;原价599&#xff0c;现在推广阶段&#xff0c;只需要10元&#xff0c;专栏持续更新中&#xff0c;会有更多的知识后续分享。如有兴趣可以用微信扫描左侧海报二维码&#xff0c;下面我将介绍专…

第14章_视图

第14章_视图 1.常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c; 程序员通常不…

ES6-let

一、基本语法 ES6 中的 let 关键字用于声明变量&#xff0c;并且具有块级作用域。 - 语法&#xff1a;let 标识符;let 标识符初始值; - 规则&#xff1a;1.不能重复声明let不允许在相同作用域内重复声明同一个变量2.不存在变量提升在同一作用域内&#xff0c;必须先声明才能试…

【项目实战】谷粒学院项目回顾

本文作者&#xff1a; slience_me 谷粒学院 谷粒学院项目致力于打造一个B2C模式的职业技能在线教育系统平台&#xff0c;采用现阶段流行技术来实现&#xff0c;采用前后端分离编写。 GitHub 地址 项目学习资源 项目文档 slience_me的博客 接口文档 谷粒学院完整代码: https…