重构贪心算法(二)

news/2024/9/19 1:05:55/ 标签: 重构, 贪心算法, 算法

上节课我们初步感受了一下算法>贪心算法,那么我们这一次就来讲述一下常见的贪心模型,今天的主题是区间覆盖
请注意,我所指的贪心模型是一大类,但是在同种大类贪心模型下,还有许多小类。

基本概念

区间覆盖指定一段大区间,再给定多个小区间,每个小区间都有长度,用这些小区间去覆盖大区间,问满足条件时最少需要用到的小区间数量。

活动安排

Q:有n个活动血药使用教室,每个都有一个对应的起始时间和终止时间,最多能举办多少个活动?

我们要举办更多的活动,也就是说当我选择一个活动之后,剩余的时间更多,这样后面的选择也就更多,所以我们要保证我们选择的活动的终止时间最短。那么很明显,所有活动中终止时间最早的那个活动一定要选。
比如左边这三个活动,绿色的活动结束时间最早,那么选择这个活动,剩下的时间最多。
当我们选了第一个终止时间最短的活动后,我们再看终止时间第二早的活动,如果和前一个活动不冲突,就选择这个活动,如果冲突,那么说明这个活动一定不选,所以我们需要根据区间右端点对活动排序。

int last=0,ans=0;
for (int i=1;i<=n;i++){if (s[i[.r>last){last=s[i].r;ans++;}
}

贪心模型1

使用时机:用这些小区间去覆盖这一段完整的区间,如果区间之间不可以重叠可以缺失,最多可以选多少个小区间。

解题策略:为了给后面的活动留出更多的空间,这样才能保证后面可以选择的活动更多,所以我们根据区间右端点从小到大排序,每次选择右端点最小的一个区间,如果和前面区间不重叠,就贪心的选择,如果重叠,那么说明这个区间一定不可以选,舍弃。

人员安排

Q:已知一个活动的起止时间,需要安排人员值班,每个人员都有固定的上下班时间(左闭右开),问最少安排多少人才能保证从活动开始到结束都有人值班

该题题意是需要最少的人把整个活动完全覆盖。
首先,我们肯定先选择开始上班时间最早的工作人员,只有这样才能保证从一开始就完全覆盖。所以我们需要按照起点排序。
其次,在当前选择的情况下,我们选择的下一个人是要和我们当前区间相交(相切)的,如果可以选择的人有多个呢?我们要如何取舍呢?
既然是要求人员最少,那么很明显,如果这个满足条件的人工作时间越晚(终止时间越晚),这样我们需要的人就会相对更少。

#include<bits/stdc++.h>
using namespace std;struct f{int b,e;
}a[101000];bool cmp(f a1,f a2){return a1.b<a2.b;
}
int main(){int n,m,cnt=0;cin>>n>>m;for (int i=0;i<n;i++){cin>>a[i].b>>a[i].e;}sort(a,a+n,cmp);int last=1;bool flag=false;for (int i=0;i<n;i++){if (last>=m){flag=true;cout<<cnt;return 0;}if (a[i].b>last){cout<<-1;return 0;}else {cnt++;int j=i,tmp=INT_MIN;while (a[j].b<=last&&j<n){tmp=max(tmp,a[j].e);j++;}last=tmp;}}if (flag==false){cout<<-1;}else cout<<cnt;return 0;
}

贪心模型2

使用时机:用这些小区间去覆盖这一段完整的区间,如果区间之间可以重叠,但是不可以缺失,最少需要选多少个小区间。

解题策略:因为要完整覆盖整个区间,那么先根据起点来选择,从头开始覆盖,对于下一次选择的区间,应该是区间有重叠并且终点最大的,这样后面未被覆盖的范围才会越小,用的小区间才会越少,所以先根据区间左端点排序,再从可以选择的区间中选择一个区间终点最大的,其他重叠的就可以舍弃了。

区间覆盖

Q:已知有N个区间,每个区间的范围是[si,ti],请求出区间覆盖后的总长

该题做法有很多种,可以排序贪心,也可以差分,这里主要讲贪心的做法。
当两个区间有重叠时,重叠部分是不计算的,当两个区间中间有空隙时,空隙是不计算的。为了保证空隙和重叠部分都有序,我们把区间根据起点排序,这样我们就能保证每次重叠部分或者空余部分都在上一个区间的末尾。对于当前线段,如果和上一次覆盖的最远距离有重叠,新增覆盖长度为 s [ i ] . r − l a s t s[i].r-last s[i].rlast。如果和上一次覆盖的最远距离有空隙,新增覆盖长度为 s [ i ] . l e n s[i].len s[i].len,同时更新覆盖的最远距离。

#include<bits/stdc++.h>
using namespace std;struct f{long long b,e;
}a[101000];bool cmp(f a1,f a2){return a1.b<a2.b;
}
int main(){int n;long long cnt=0;cin>>n;for (int i=0;i<n;i++){cin>>a[i].b>>a[i].e; }sort(a,a+n,cmp);long long last=0;for (int i=0;i<n;i++){if (a[i].b<=last&&a[i].e>last){cnt+=a[i].e-last;  last=a[i].e;}else if (a[i].b<=last&&a[i].e<=last)continue;else {cnt+=a[i].e-a[i].b+1;last=a[i].e;}}cout<<cnt;return 0;
}

贪心模型3

使用时机:用小区间去覆盖一个长区间,可以重叠可以缺失,但是不可以舍去,求覆盖区间的总长

解题策略:为了保证空隙和重叠部分都有序,我们把区间根据起点排序,这样我们就能保证每次重叠部分或者空余部分都在上一个区间的末尾。,然后判断当前线段是否与上一次覆盖的最远距离有重叠。

教室安排

Q:有若干个活动,第i个活动的开始时间和结束时间分别是[Si,Ti)(左闭右开),同一个教室安排的活动之间不能交叠,求要安排所有的活动,最少需要几个教室?

该题不再是求最多可以举办多少活动,而是问如果所有活动都要举行,需要多少教室。
首先,为了方便我们判断时间是否有冲突,先根据终止时间排序。
接下来,来了一个活动,我们要判断是否需要新开一间教室或者在哪一间教室的基础上举办该活动。
(1)新开一间教室
如果当前所有教室的终止时间>该活动的开始时间那么没有任何教室可以举办办活动,只能新开
(2)选择一间教室举办活动

为了让结果最优,假设有多间教室满足条件,我们该如何选取。通过画图我们发现每次加到结束时间最晚的效果最好。

#include <bits/stdc++.h> 
using namespace std;
struct node{long long l;long long r;
}a[1000100];
bool cmp(node x,node y){return x.r<y.r;
}
long long b[1000100];
int main(){long long n,cnt=0;cin>>n;for(int i=1;i<=n;i++){cin>>a[i].l>>a[i].r;b[i]=1;}sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++){int k=0;for(int j=1;j<=cnt;j++){if(a[i].l>=b[j]&&b[j]>b[k]){k=j;}}if(k==0){cnt++;b[cnt]=a[i].r;}else{b[k]=a[i].r;}}cout<<cnt;return 0;
}

贪心模型4

使用时机:当多个小区间都不能舍去且不能重叠时,让我们求可以最少用多少个轨道(也就是上面的教室)可以办到。

贪心策略:为了方便我们判断时间是否有冲突,先根据终止时间排序。现在我们只需要判断当前区间的开始时间是否比某个轨道的末尾时间晚,如果有,则选择开始时间最晚的,如果没有,则重新开一个轨道。

种树

Q:一条街的一边有几座房子,因为环保原因居民想要在路边种些树。路边的地区被分割成块,并被编号成1,2,…,n。每个部分为一个单位尺寸大小并最多可种一棵树。每个居民都想在门前种些树,并指定了三个号码 b,e,t。这三个数表示该居民想在地区 b 和 e 之间(包括 b 和 e)种至少 t 棵树。居民们想种树的各自区域可以交叉。你的任务是求出能满足所有要求的最少的树的数量。

1、按区间终点从小到大排序 2、先统计区间已经种树的数量,再从末尾向前栽剩下的树。注意已经栽过树的位置要忽略

#include <bits/stdc++.h>
using namespace std;
int vis[1000000];struct node{int s,f,tree;
}a[1000000];bool cmp(node c,node b){return c.f<b.f;
}int min(int a,int b){if(a<=b)return a;else return b;
}int main(){int m,n,flag=0;cin>>m>>n;for(int i=0;i<n;i++){cin>>a[i].s>>a[i].f>>a[i].tree;}sort(a,a+n,cmp);int count;count=0;    for(int i=0;i<n;i++){for(int j=a[i].s;j<=a[i].f;j++){if(!a[i].tree)break;if(vis[j])a[i].tree--;}for(int j=a[i].f;j>=a[i].s;j--){if(!a[i].tree)break;if(!vis[j]){a[i].tree--;flag++;vis[j]=1;}}}cout<<flag;return 0;
}

贪心模型5

使用时机:区间固定,要求固定,要求覆盖面积最小。

解题策略:因为要求覆盖面积最小,那就应该尽可能把小区间堆在区间的重叠区域,为了方便查找重叠区域,我们尽量保证新加进来一个区间后,重叠部分是有序增加的,如重叠部分在末尾或者开头。

总结

对于区间覆盖这一类问题,一般情况下都是根据起点或者终点来排序,然后每次贪心的选择最优解从而得到最终答案。


http://www.ppmy.cn/news/1519625.html

相关文章

中资优配:公募基金持股市值超5万亿 电子成第一大重仓行业

作为A股最为重要的组织投资者之一&#xff0c;公募基金的意向备受商场重视。 据证券时报数据宝核算&#xff0c;到二季度末&#xff0c;公募基金持有上市公司家数为5058家&#xff0c;较上一年同期添加119家&#xff1b;持股量为2990.71亿股&#xff0c;同比添加14.49%。 在商…

一文带你上手自动化测试中的PO模式!

自动化测试在软件测试项目团队中发挥着重要的作用&#xff0c;同时合理地开展自动化测试&#xff0c;可以有效降低错误修复成本&#xff0c;提高工作效率。 下面就以web自动化测试为例来说明POM模式&#xff1a;pythonSeleniumpytest框架下&#xff0c;完成自动化测试用例的编…

【Qt】Qt系统 | Qt文件

文章目录 一. 输入输出设备类二. 文件读写类三. 文件和目录信息 文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库&#xff0c;提供了跨平台的文件操作能力&#xff0c;封装了很多关于文件的类&#xff0c;通过这些类能够对文件系统进行操作&#xff0c;如文件读写、文…

基于Django的MySQL项目建设计划

构建一个基于 Django 和 MySQL 的项目需要经过多个阶段的规划和实施。以下是一个详细的建设计划&#xff0c;分为项目准备、开发、测试和部署等几个关键阶段。 1、问题背景 为了完成大学的 “问答网站” 项目&#xff0c;需要在几天内完成项目的计划&#xff0c;并于下周二准备…

MAC安装miniconda提示“文本编码Unicode(UTF-8)不适用”解决方案

需求背景 客户需要在mac环境下安装miniconda&#xff0c;提示安装失败&#xff0c;主要原因是安装版本不对&#xff0c;在选择合适版本&#xff0c;配置好环境后问题得以解决&#xff01; 报错提示 版本和环境错误 前往地址下载正确版本 https://repo.anaconda.com/miniconda…

基于RK3568平台opencv的图像采集、ffmpeg推流和Windows端拉流(多线程)

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、移植流程3.1 编写测试3.2 验证功能一、概述 本章节是针对ffmpeg移植到 Linux系统,运行在RK3568开发板上,首先创建一个线程opencv通过摄像头采集视频图像,接着再创建两个线程,其中一个线程获取采集的视频图像送给ffm…

去中心化身份验证:Web3时代数字身份的革新

随着Web3时代的到来&#xff0c;去中心化技术正在重新定义数字身份验证的方式。传统的身份验证方法常常依赖于中心化的数据库和中介机构&#xff0c;这些系统不仅易受攻击&#xff0c;还可能侵犯用户的隐私。而去中心化身份验证&#xff08;DID, Decentralized Identifier&…

Pycharm的终端(Terminal)中切换到当前项目所在的虚拟环境

如果想更近一步&#xff0c;如果想让Pycharm默认显示项目所在虚拟环境&#xff0c;而不是系统基本环境&#xff0c;可以在设置里面更改&#xff0c;点击设置即可进入修改页面&#xff0c;也可以通过文件/File-设置/setting/-工具/Tools-终端/Terminal

乾元通渠道商中标湖南省煤业集团公司安全生产预防和应急救援能力建设装备配备采购项目

近日&#xff0c;乾元通渠道商中标湖南省煤业集团安全生产预防和应急救援能力建设装备配备采购项目&#xff0c;乾元通作为聚合通讯保障技术厂家&#xff0c;为项目一标段卫星通讯指挥车提供车载聚合路由器终端及系统。 乾元通经过多年发展&#xff0c;逐步建起车载系列多链路聚…

在Ubuntu/Linux下重温FC游戏——超级玛丽奥

文章目录 在Ubuntu/Linux下重温FC游戏——超级玛丽奥1 概述2 安装 FCEUX 模拟器3 下载 FC ROMS4 重温时光 在Ubuntu/Linux下重温FC游戏——超级玛丽奥 1 概述 FC 游戏机&#xff0c;是任天堂生产、发行和销售的 8 位第三世代家用游戏机&#xff0c;日本版官方名称为家庭电脑&…

爬虫技术抓取网站数据被限制怎么处理

爬虫技术用于抓取网站数据时&#xff0c;可能会遇到一些限制&#xff0c;常见的包括反爬机制、速率限制、IP封禁等。以下是应对这些情况的一些策略&#xff1a; 尊重robots.txt&#xff1a;每个网站都有robots.txt文件&#xff0c;遵循其中的规定可以避免触犯网站的抓取规则。 …

vscode go开发环境

go 安装go&#xff08;1.19&#xff09; 配置环境变量 vscode 安装vscode&#xff08;VSCode-win32-x64-1.92.2&#xff09; 安装go扩展 更新go工具 CtrlShiftP打开命令面板&#xff1b; 搜索 Go: Install/Update tools&#xff0c;选择所有可用的…

Artfi将蓝筹艺术投资引入Sui

Asif Kamal希望每个人都能拥有一幅毕加索的作品&#xff0c;或者至少拥有其中的一部分。 全球艺术市场每年销售额达650亿至700亿美元&#xff0c;主要通过包括苏富比、佳士得和邦瀚斯在内的六大主要机构流通。投资蓝筹艺术品可能非常有利可图。然而&#xff0c;对于普通人来说…

Linux文件共享

FTP tcp协议的传输文件标准&#xff0c;安装方法yum install -y vsftpd&#xff0c;使用systemctl start vsftpd开启服务&#xff0c;使用setenforce 0和systemctl stop firewalld关闭SELinux和防火墙&#xff0c;避免对ftp协议的干扰。 客户端使用yum -y install ftp安装ftp…

c语言赋值截断

目录 截断含义 截断举例 截断含义 在C语言中&#xff0c;将一个较宽范围的整型&#xff08;如16位的short或int16_t&#xff09;赋值给一个较窄范围的整型&#xff08;如8位的char或int8_t&#xff09;时&#xff0c;如果原值超出了目标类型的表示范围&#xff0c;就会发生所…

一种动态防御策略——移动目标防御(MTD)

文章速览&#xff1a; 1、高级规避攻击 2、用移动目标防御对抗欺骗 常见做法操作系统和应用程序才是真正的战场打破游戏规则 网络攻击的技术变得愈发难测&#xff0c;网络攻击者用多态性、混淆、加密和自我修改乔装他们的恶意软件&#xff0c;以此逃避防御性的检测&#xff0c;…

把http网站变成https

网站建设好后默认是HTTP网站&#xff0c;会被浏览器直接标注为不安全站点&#xff0c;甚至搜索引擎上也排名也不是那么出色。 HTTP协议是浏览网站和在线资源的基本协议。由于HTTP的连接未加密&#xff0c;因此往往不安全。HTTPS是默认HTTP协议的安全扩展。 访问HTTPS网站时&…

MyBatis关联查询的方式

文章目录 一对一关联查询XML方式注解方式 一对多关联查询XML方式注解方式 多对多关联查询XML方式注解方式 注意事项 MyBatis是一个优秀的持久层框架&#xff0c;它支持复杂的SQL查询、映射以及高级映射。在处理关联查询时&#xff0c;MyBatis提供了强大的支持&#xff0c;无论是…

【 html+css 绚丽Loading 】 000031 三元轮回盘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

东南大学研究生-数值分析上机题(2023)Python 4 多项式插值与函数最佳逼近

3次样条插值函数 4.1 题目 (1) 编写求第一型3次样条插值函数的通用程序&#xff1b; (2) 已知汽车门曲线型值点的数据如下&#xff1a; i012345678910xi012345678910yi2.513.304.044.705.225.545.785.405.575.75.80 端点条件为 y 0 ′ 0.8 y_00.8 y0′​0.8&#xff0c; y…