区间贪心

目录

1.贪心算法的思想

2.区间贪心算法常用的一些题目类型

1.选择最多不相交区间问题

P2970 [USACO09DEC] Selfish Grazing S

 1.思路分析

2.上代码

2.区间选点问题

P1250 种树

1.题目

2.方法一

1.代码解释

 3.方法二

3.区间合并问题

P2434 [SDOI2005] 区间

1. 思路分析

2.上代码

4.区间覆盖问题

 P1668 [USACO04DEC] Cleaning Shifts S

1.思路分析

 2.代码解释

5.区间分组

T471772 cici排课

​编辑 1.一点点思路

2.代码实现与算法思路

3.举一反三

3.遇到了(区间)贪心的题我们应该怎么做

end👍🏻⭐ok?


1.贪心算法的思想

贪心算法是从问题的初始状态出发,通过若干次的贪心选择而得到的最优值(或较优值)的1种求解问题策略,即贪心策略。

2.区间贪心算法常用的一些题目类型

1.选择最多不相交区间问题

P2970 [USACO09DEC] Selfish Grazing S

洛谷:P2970 [USACO09DEC] Selfish Grazing S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P2970

 1.思路分析

题题目的大概意思就是给定我们N个区间,求最多不相交区间有多少个。

我们可以按照区间的右端点从小到大排序

 然后我们创建一个变量命名为j和一个变量cnt(计数),再次循环整个结构体(输入的那些区间,已经排序完), 如果循环到的这个区间的左端点在标签变量j的右边,把j更新为这个区间的左端点,cnt++

2.上代码
#include <bits/stdc++.h>
using namespace std;
struct M{int s,e;
}a[500005];
bool cmp(M x,M y){return x.e <y.e;
}
int main(){int n;cin >> n;for(int i =0; i < n; i++){cin >> a[i].s >> a[i].e;}sort(a,a+n,cmp);int j = -1,cnt = 0;for (int i =0; i < n; i++){if (a[i].s >= j){j = a[i].e;cnt ++;}}cout << cnt;return 0;
}

2.区间选点问题

P1250 种树

洛谷:

P1250 种树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1250

1.题目

 

2.方法一

 把所有树都往右边种,为了让他们重叠区间的更多,而且重叠的部分大部分都在右侧,我们就要让这些区间按右端点,从小到大排序,下图是我列举的样例。

首先先把样例归一整一下(排序)

123456789
||
|
|

从第一个开始在尾巴上种树,如果这个区间内已经种到了t[i]棵的话就不种了 , 如果没有种到这么多棵树那就得从后往前,循环种树只要种到为止.(括号代表已经种上树了,+1代表多种一棵树)

123456789
|(|)+1(】)+1
(【)(|)(】)被底下的人种上了
(【)(|)+1
(【)+1(】)+1

其实这样的话更形象,就是有点乱:

123456789
([)|(|[)(]|[)(]|)]([)(])

 同样颜色是一个区间

贪心加模拟的思想

1.代码解释
#include <bits/stdc++.h>
using namespace std;
bool v[100005];
struct Sa{int a,b,c;
}s[100005];
bool cmp(Sa x,Sa y){return x.b < y.b;
}

我定义了一个叫做s的 结构体,s[i].a = b,s[i].b = e,s[i].c = t(这些值和题目中的数);

这一段代码靠下的cmp是排序函数

v数组就是大街,就是那个有点乱的图

___________________________优雅的分界线_______________________

输入+排序 

int main(){int q;int n;cin >> q>> n;for (int i =1; i <= n; i++){cin >> s[i].a >> s[i].b >> s[i].c;}sort(s+1,s+n+1,cmp);

___________________________优雅的分界线_______________________

    int cnt = 0;for (int i = 1; i <= n; i++){int sum = 0;for (int j = s[i].a; j <= s[i].b; j++){if (v[j]) sum ++;}if (sum >= s[i].c){continue;}

 循环的第一部分, sum的值是在这个区间内种了多少棵树,如果已经种够了那就不用循环这一次看下一次区间.

___________________________优雅的分界线_______________________

		sum = s[i].c - sum;cnt += sum;for (int j = s[i].b; j >= s[i].a; j--){if (v[j] == 0){sum --;v[j] = 1;}if (sum == 0){break;}}

 循环的第二部分,sum值变成还差多少棵树,总共棵数增加sum,循环种树(倒过来循环);

___________________________优雅的分界线_______________________

最后输出cnt;

___________________________优雅的分界线_______________________

总体代码

#include <bits/stdc++.h>
using namespace std;
bool v[100005];
struct Sa{int a,b,c;
}s[100005];
bool cmp(Sa x,Sa y){return x.b < y.b;
}
int main(){int q;int n;cin >> q>> n;for (int i =1; i <= n; i++){cin >> s[i].a >> s[i].b >> s[i].c;}sort(s+1,s+n+1,cmp);int cnt = 0;for (int i = 1; i <= n; i++){int sum = 0;for (int j = s[i].a; j <= s[i].b; j++){if (v[j]) sum ++;}if (sum >= s[i].c){continue;}sum = s[i].c - sum;cnt += sum;for (int j = s[i].b; j >= s[i].a; j--){if (v[j] == 0){sum --;v[j] = 1;}if (sum == 0){break;}}}cout << cnt;return 0;
}
 3.方法二

换1种方法可以反过来运算,就像加有减,除有乘

也就是从左到右去种树,排序的时候按照左端点从小到大排序,

直接演示代码吧!

#include <bits/stdc++.h>
using namespace std;
bool v[100005];
struct Sa{int a,b,c;
}s[100005];
bool cmp(Sa x,Sa y){return x.a > y.a;
}
int main(){int q;int n;cin >> q>> n;for (int i =1; i <= n; i++){cin >> s[i].a >> s[i].b >> s[i].c;}sort(s+1,s+n+1,cmp);int cnt = 0;for (int i = 1; i <= n; i++){int sum = 0;for (int j = s[i].a; j <= s[i].b; j++){if (v[j]) sum ++;}if (sum >= s[i].c){continue;}sum = s[i].c - sum;cnt += sum;for (int j = s[i].a; j <= s[i].b; j++){if (v[j] == 0){sum --;v[j] = 1;}if (sum == 0){break;}}}cout << cnt;return 0;
}

3.区间合并问题

P2434 [SDOI2005] 区间

网址:

P2434 [SDOI2005] 区间 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P2434

 

1. 思路分析

给出若干个区间让我们输出它们可以合并出来最少的区间(个数,但是输出区间)。

1.按照左端点排序

2.排序完了以后定义两个变量L和R,L=第一个区间的左端点,R=第一个区间的右端点

3.遍历一遍这些区间(不包含第一个)

4.如果这个区间的左端点(开端),大于了R(这个区间不在我们L~R里不包含它),输出L和R,把L的值更新为这个区间的左端点(更新一下整个区间)

5. R的值和区间的右端点做比较选取最大的那个值更新R

2.上代码
#include <bits/stdc++.h>
using namespace std;
struct B{int l,r;
}a[1000005];
bool cmp(B x, B y){return x.l < y.l;
}
int main(){int n;cin >> n;for (int i = 0; i < n; i++){cin >> a[i].l >> a[i].r;}sort(a,a+n,cmp);int R = a[0].r,L = a[0].l;for (int i=1; i <n ; i++){if (a[i].l > R){cout << L << " " << R << "\n";L = a[i].l;}R = max(a[i].r,R);}cout << L << " " << R << "\n";return 0;
}

4.区间覆盖问题

 P1668 [USACO04DEC] Cleaning Shifts S

 P1668 [USACO04DEC] Cleaning Shifts S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1668

这道题题目的意思是:给定我们一个区间1~T,我们有N个小区间,请问需要最少几个小区间可以覆盖整个大区间(1~T),请注意两个区间之间可以差一,只要每个时间段都有奶牛也可以,比如(1,2)(3,4)它们就可以并到一起去。虽然它讲起来是时间段但是它做起来是时间点。

1.思路分析

图片分析请看下图

 2.代码解释
#include <bits/stdc++.h>
using namespace std;
struct Sa{int a,b;
}s[100005];
bool cmp(Sa x,Sa y){return x.a < y.a;
}
int main(){int n,t;cin >> n >> t;int cnt=0;for (int i= 1; i <= n; i++){cin >> s[i].a >> s[i].b;}sort(s+1,s+n+1,cmp);

结构体函数+排序函数cmp按照左端点从小到大排+输入与排序

int l = 1,r = -1;for (int i = 1; i <= n;){if (s[i].a > l){cout <<-1;return 0;}

如果左端点最靠前的那个区间,左端点还是大于L,说明整个区间结构体没有一个左端点小于等于L,输出负一不能实现

while (i <= n and s[i].a <= l){r = max(s[i].b,r);i++;}cnt ++;

去看,左端点小于等于,而且右端点是最大的.增加区间段数(cnt).

if (r >= t){cout << cnt;return 0;}l = r +1;}

如果我们的最大值已经超过了T输出cnt,把L更新为r+1.

cout << -1;return 0;
}

对如果在循环里都没结束的话,说明不可以实现输出-1

 总体代码

#include <bits/stdc++.h>
using namespace std;
struct Sa{int a,b;
}s[100005];
bool cmp(Sa x,Sa y){return x.a < y.a;
}
int main(){int n,t;cin >> n >> t;int cnt=0;for (int i= 1; i <= n; i++){cin >> s[i].a >> s[i].b;}sort(s+1,s+n+1,cmp);int l = 1,r = -1;for (int i = 1; i <= n;){if (s[i].a > l){cout <<-1;return 0;}while (i <= n and s[i].a <= l){r = max(s[i].b,r);i++;}cnt ++;if (r >= t){cout << cnt;return 0;}l = r +1;}cout << -1;return 0;
}

5.区间分组

呃……,这道题你们就看图片吧!

T471772 cici排课

 1.一点点思路

这个题目不在于老师的编号是多少哪个老师该上哪节课,只用求出老师的个数就行。

只要有课程下课了的话我们就可以释放老师,如果释放了新课,既要把新课排给被释放的老师.

2.代码实现与算法思路

#思路

我们输给两个数组(a,b),注意在这里不要用区间的眼光看这两个数组, 数组要分开来排序, a从小到大排序b也从小到大排序,定义一个变量cnt(老师数量)然后循环:

a的i号位的数与b的第j号位对比,如果小于等于B的第j号位{

        cnt++

        查看a的i+1号位//也就是i++;

}//这个循环也就是循环到a[i]>b[j],看一看在b[j]这个课结束之前,还会上多少节课

如果b[j]比a[i]为小的话{//也就是说有老师被释放出来了

        cnt --

        j++;//看下一位

}

#代码实现,增加一些判断我会进行注释 

为什么要求最大值,因为这种方法是最值的,而求最大值是要求这种最值方法需要多少名老师

#include <bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
int main(){int n;cin >> n;for (int i =0; i < n; i++){cin >> a[i] >> b[i];}sort(a,a+n);sort(b,b+n);int i = 0,j = 0,big = -1,cnt = 0;while (1){while (i < n and a[i] <= b[j]){cnt ++;big = max(cnt,big);//求最大值i ++;}if (i >= n) break;  //如果要上的课都检查完了就退出输出最大值while (j < n and b[j] < a[i]){cnt --;j ++;}}cout << big;return 0;
}
3.举一反三

这道题会让我们想起“匹配括号”,虽然不知道这个题名字叫做什么,但是题目的大致意思如下:

输入一个字符串字符串用“(”和“)”组成,“(”和“)”可以形成一组,请问输入的字符串有没有多余的括号。如果没有输出“yes”如果有输出“no”(不加引号)。

就比如输入:

((())())

很明显是匹配上了的

请看下列表格是我们这道题的算法,左括号加一,右括号减一

12321210

如果最后等于零的话就可以匹配成功.

不过你可能会问这道题和cici排课有什么关系 ,你可以把题目改编一下变成:

还是输入一个字符串,每一个符号(左括号、右括号)之间,输出我们的cnt最大值。

我们借鉴上面的表格,这个题目就可以输出3

而我们的CiCi排课也是同样的道理,左括号是开始上课,右括号是结束上课,问你老师人数的最大值.

3.遇到了(区间)贪心的题我们应该怎么做

找出我们要排序的顺序按什么排序,

再进行循环,加入题目的要求

最后说一句特殊题目特殊判断,一定要变得灵活起来.

end👍🏻⭐

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

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

相关文章

Java集合面试题

Java集合框架 1、List、Set、Map的区别2、ArrayList、LinkedList、Vector区别3、为什么数组索引从0开始&#xff0c;而不是从1开始&#xff1f;4、ArrayList底层的实现原理5、红黑树、散列表6、HashMap的底层原理7、HashMap的put方法具体流程8、HashMap的扩容机制9、HashMap是怎…

南方科技大学马永胜教授给年轻人使用AI工具上的建议

摘要 - 1. AI的未来&#xff0c;是机器人和机器人之间的合作&#xff1b; 2. 行业的发展方向是需求决定的&#xff0c;不要做同质化的发展&#xff0c;要做专/精/特/新&#xff1b; 3. 新质生产力 &#xff08; 科学技术革命性突破 生产要素创新型配置 产业深度转型升级&…

java通过poi-tl导出word实战详细步骤

文章目录 与其他模版引擎对比1.引入maven依赖包2.新建Word文档exportWprd.docx模版3.编写导出word接口代码4.导出成果 poi-tl是一个基于Apache POI的Word模板引擎&#xff0c;也是一个免费开源的Java类库&#xff0c;你可以非常方便的加入到你的项目中&#xff0c;并且拥有着让…

Pix4Dmapper:无人机测绘的革命性工具

在现代测绘和地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;Pix4Dmapper无疑是一款革命性的工具。作为一名长期使用这款软件的用户&#xff0c;我深深感受到它在工作中的重要性和便利性。Pix4Dmapper不仅仅是一款软件&#xff0c;更是测绘工作者的得力助手&#xff…

285个地级市出口产品质量及技术复杂度(2011-2021年)

出口产品质量与技术复杂度&#xff1a;衡量国家竞争力的关键指标 出口产品质量是衡量国内企业生产的产品在国际市场上竞争力的重要标准。它不仅要求产品符合国际标准和目标市场的法律法规&#xff0c;而且需要保证产品质量的稳定性和可靠性。而出口技术复杂度则进一步体现了一…

批量下载手机中APP程序中文件

需求 利用 adb pull 下载手机中app的某目录 adb pull 命令本身不支持直接下载整个目录&#xff08;文件夹&#xff09;及其所有子目录和文件作为一个单一的操作。但是&#xff0c;可以通过一些方法来间接实现这一目的。 方法 1. 首先将要下载的目录进行 tar 打包 # 在 And…

【atcoder】习题——位元枚举

题意&#xff1a;求i&M的popcount的和&#xff0c;i属于0……N 主要思路还是变加为乘。 举个例子N22&#xff0c;即10110 假设M的第3位是1&#xff0c;分析N中&#xff1a; 00110 00111 00100 00101 发现其实等价于 0010 0011 0000 0001 也就是左边第4位和第5…

算法学习笔记(8.1)-动态规划入门

目录 问题特性&#xff1a; 最优子结构&#xff1a; 代码示例&#xff1a;&#xff08;动态规划最优子结构&#xff09; 上述最小代价爬楼梯的运行过程&#xff1a; 代码示例&#xff1a; 无后效性&#xff1a; 解析&#xff1a; 具体过程图示如下&#xff1a; 具体的…

如何为IP申请SSL证书

目录 以下是如何轻松为IP地址申请SSL证书的详细步骤&#xff1a; 申请IP证书的基本条件&#xff1a; 申请IP SSL证书的方式&#xff1a; 确保网络通信安全的核心要素之一&#xff0c;是有效利用SSL证书来加密数据传输&#xff0c;特别是对于那些直接通过IP地址访问的资源。I…

使用 Azure DevOps Pipelines 生成 .NET Core WebJob 控制台应用 CI/CD

Web 应用程序通常需要作为后台任务运行的进程&#xff0c;并在特定时间间隔进行计划或在事件中触发。它们不需要花哨的 IO 接口&#xff0c;因为重点是过程而不是输出。Azure WebJobs 提供了出色的支持&#xff0c;通常在云环境中通过 Web 控制台应用程序来实现此目的。WebJob …

Mac平台虚拟机 Parallels Desktop v19.4.1,支持M1/M2/M3芯片组

Parallels Desktop for Mac是功能强大灵活度高的虚拟化方案&#xff0c;无需重启即可在同一台电脑上随时访问Windows和Mac两个系统上的众多应用程序。从仅限于PC的游戏到生产力软件&#xff0c;Parallels Desktop都能帮您实现便捷使用。Parallels Desktop 是一款专业的Mac虚拟机…

Docker搭建kafka+zookeeper以及Springboot集成kafka快速入门

参考文章 【Docker安装部署KafkaZookeeper详细教程】_linux arm docker安装kafka-CSDN博客 Docker搭建kafkazookeeper 打开我们的docker的镜像源配置 vim /etc/docker/daemon.json 配置 { "registry-mirrors": ["https://widlhm9p.mirror.aliyuncs.com"…

Linux Mac 安装Higress 平替 Spring Cloud Gateway

Linux Mac 安装Higress 平替 Spring Cloud Gateway Higress是什么?传统网关分类Higress定位下载安装包执行安装命令执行脚本 安装成功打开管理界面使用方法configure.shreset.shstartup.shshutdown.shstatus.shlogs.sh Higress官网 Higress是什么? Higress是基于阿里内部的…

思考:Java内存模型和硬件内存模型

前言 前一阵在看volatile的原理&#xff0c;看到内存屏障和缓存一致性&#xff0c;发现再往底层挖就挖到了硬件和Java内存模型。这一块是自己似懂非懂的知识区&#xff0c;我一般称之为知识混沌区。因此整理这一篇文章。 什么是内存模型&#xff08;Memory Model&#xff09;…

CentOS6用文件配置IP模板

CentOS6用文件配置IP模板 到 CentOS6.9 , 默认还不能用 systemctl , 能用 service chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 ### chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 sudo chkconfig sshd onservice sshd start …

未羽研发测试管理平台

突然有一些觉悟&#xff0c;程序猿不能只会吭哧吭哧的低头做事&#xff0c;应该学会怎么去展示自己&#xff0c;怎么去宣传自己&#xff0c;怎么把自己想做的事表述清楚。 于是&#xff0c;这两天一直在整理自己的作品&#xff0c;也为接下来的找工作多做点准备。接下来…

LT7911UX 国产原装 一拖三 edp 转LVDS 可旋转 可缩放

2.一般说明 该LT7911UX是一种高性能Type-C/DP1.4a到MIPI或LVDS芯片的VR/显示应用。HDCP RX作为HDCP转发器的上游&#xff0c;可以与其他芯片的HDCP TX配合实现转发器功能。 对于DP1.4a输入&#xff0c;LT7911UX可配置为1/2/4通道。自适应均衡使其适用于长电缆应用&#xff0c;最…

Junior.Crypt.2024 CTF Web方向 题解WirteUp 全

Buy a cat 题目描述&#xff1a;Buy a cat 开题 第一思路是抓包改包 Very Secure App 题目描述&#xff1a;All secrets become clear 开题 乱输一个密码就登陆成功了&#xff08;不是弱口令&#xff09; 但是回显Your role is: user 但是有jwt&#xff01;&#xff01;&a…

记录在Windows上安装Docker

在Windows上安装Docker时&#xff0c;可以选择使用不同的后端。 其中两个常见的选择是&#xff1a;WSL 2&#xff08;Windows Subsystem for Linux 2&#xff09;和 Hyper-V 后端。此外&#xff0c;还可以选择使用Windows容器。 三者的区别了解即可&#xff0c;推荐用WSL 2&…

我们公司落地大模型的路径、方法和坑

我们公司落地大模型的路径、方法和坑 李木子 AI大模型实验室 2024年07月02日 18:35 北京 最近一年&#xff0c;LLM&#xff08;大型语言模型&#xff09;已经成熟到可以投入实际应用中了。预计到 2025 年&#xff0c;AI 领域的投资会飙升到 2000 亿美元。现在&#xff0c;不只…