贪心-区间问题

区间选点和最大不相交区间数量

区间选点问题描述

问题描述

给定 N个闭区间 [ai,bj],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。
输出选择的点的最小数量。
位于区间端点上的点也算作区间内。

输入格式

第一行包含整数 N,表示区间数。
接下来 N 行,每行包含两个整数 ai,bj,表示一个区间的两个端点。

输出格式

输出一个整数,表示所需的点的最小数量。

数据范围

1≤N≤ 1 0 2 10^2 102,− 1 0 9 10^9 109≤ai≤bi≤ 1 0 9 10^9 109

输入样例:

3
-1 1
2 4
3 5

输出样例:

2

问题分析

  1. 将区间按右端点排序
  2. 遍历区间,如果该区间中不包含最后选的那个点,则选取区间右端点。如果包含最后选的那个点,则跳过。
  3. 输出所选点的个数。

最大不相交区间数量问题描述

问题描述

给定 N个闭区间 [ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。
输出可选取区间的最大数量。

输入格式

第一行包含整数 N,表示区间数。
接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。

输出格式

输出一个整数,表示可选取区间的最大数量。

数据范围

1≤N≤105,−109≤ai≤bi≤109

输入样例:

3
-1 1
2 4
3 5

输出样例:

2

问题分析

  1. 将区间按右端点排序
  2. 遍历区间,如果该区间和上一个选的区间有重合,则跳过。如果和上一个选的区间没有重合,则选取该区间。
  3. 输出所选区间的个数。

代码

上述两个问题的题意基本差不多,因此可以代码相同。

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n;
struct Range
{int l,r;bool operator<(const Range &W)const{return r<W.r; // 重载小于运算符,用于排序}
}Range[N];
int main()
{cin>>n;for(int i=0;i<n;i++) cin>>Range[i].l>>Range[i].r; // 输入每个区间的左右端点sort(Range,Range+n); // 对区间按照右端点从小到大排序int res=0,ed=-2e9; // 初始化结果为0,ed为一个较小的数for(int i=0;i<n;i++){if(Range[i].l>ed)  // 如果当前区间的左端点大于ed{res++;ed=Range[i].r; // 更新ed为当前区间的右端点}}cout<<res<<endl;return 0;
}

区间分组

区间问题的描述

问题描述

给定 N个闭区间 [ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。
输出最小组数。

输入格式

第一行包含整数 N,表示区间数。
接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。

输出格式

输出一个整数,表示最小组数。

数据范围

1≤N≤105,−109≤ai≤bi≤109

输入样例:

3
-1 1
2 4
3 5

输出样例:

2

问题分析

  1. 将区间按左端点排序。
  2. 依次遍历区间,如果当前区间能放到之前的某个集合中,则把该区间放到该集合,如果当前不能放到任意一个之前的集合中,则新开一个集合,把当前区间放到新开的集合中。
  3. 集合的数量就是答案。

关键步骤是第二步,如何判断当前区间能否放到之前的集合中。解决方法如下:
记录每个集合中保存的区间的最右侧端点,如果当前区间的左端点不和某个集合中保存的区间的最右侧端点相交,则当前区间不和该集合相交,能放到该集合中。
也就是,我们只需判断当前区间的左端点 是否和 右侧端点最小的那个集合是否相交即可。
为了快速找出右侧端点最小的那个集合,可以使用小根堆保存每个集合的右端点。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n;
struct Range
{int l,r;bool operator<(const Range &W)const {return l<W.l;}
}Range[N];
int main()
{cin>>n;for(int i=0;i<n;i++) cin>>Range[i].l>>Range[i].r;sort(Range,Range+n);priority_queue<int,vector<int>,greater<int>> heap; // 定义一个最小堆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()<<endl; // 输出堆的大小,即不重叠区间的数量return 0;
}

区间覆盖

区间覆盖问题描述

问题描述

给定 N个闭区间 [ai,bi] 以及一个线段区间 [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。
输出最少区间数,如果无法完全覆盖则输出 −1。

输入格式

第一行包含两个整数 s和 t,表示给定线段区间的两个端点。
第二行包含整数 N,表示给定区间数。
接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。

输出格式

输出一个整数,表示所需最少区间数。
如果无解,则输出 −1。

数据范围

1≤N≤105,−109≤ai≤bi≤109,−109≤s≤t≤109
输入样例:

1 5
3
-1 3
2 4
3 5

输出样例:

2

问题分析

  1. 将所有区间按照左端点从小到大进行排序
  2. 从前往后枚举每个区间,在所有能覆盖start的区间中,选择右端点的最大区间,然后将start更新成右端点的最大值

代码

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int st,ed; // 定义起点和终点
int n; // 区间个数
struct Range
{int l,r; // 区间的左右端点bool operator<(const Range &W)const{return l<W.l; // 重载小于运算符,用于排序}
}Range[N];
int main()
{cin>>st>>ed; // 输入起点和终点cin>>n; // 输入区间个数for(int i=0;i<n;i++) cin>>Range[i].l>>Range[i].r; // 输入每个区间的左右端点sort(Range,Range+n); // 对区间按照左端点从小到大排序int res=0; // 初始化结果为0bool sucess=false; // 初始化成功标志为falsefor(int i=0;i<n;i++){int j=i,r=-2e9; // 初始化j为i,r为一个较小的数while(j<n && Range[j].l<=st) // 当j小于n且当前区间的左端点小于等于起点时{r=max(r,Range[j].r); // 更新r为当前区间的右端点和r中的最大值j++; // j加1}if(r<st) // 如果r小于起点{res=-1; // 结果设为-1break; // 跳出循环}res++; // 结果加1if(r>=ed) // 如果r大于等于终点{sucess=true; // 成功标志设为truebreak; // 跳出循环}st=r; // 更新起点为ri=j-1; // i更新为j-1}if(!sucess) res=-1; // 如果成功标志为false,结果设为-1cout<<res<<endl; // 输出结果return 0;
}

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

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

相关文章

python学习笔记----异常、模块与包(九)

一、异常 1.1 什么是异常 在Python中&#xff0c;异常是程序执行时发生的错误。当Python检测到一个错误时&#xff0c;它会引发一个异常&#xff0c;这可能是由于多种原因&#xff0c;如尝试除以零、访问不存在的文件&#xff0c;或者尝试从列表中获取不存在的索引等。异常处…

数组的拷贝

数组的拷贝 文章目录 数组的拷贝浅拷贝内存分析 深拷贝内存分析 浅拷贝 概念&#xff1a;数组的浅拷贝是指新数组保存的是原数组的内存地址&#xff0c;并没有拷贝真正的值&#xff0c;如果原数组的内容发生改变那么新数组的内容也会发生相应改变。 代码实现&#xff1a; pu…

C语言/数据结构——每日一题(合并两个有序链表)

一.前言 嗨嗨嗨&#xff0c;大家好久不见&#xff01;今天我在LeetCode看到了一道单链表题&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists想着和大家分享一下&#xff0c;废话不多说&#xff0c;让我们开始今天的题目分享吧。 二.正文 1.1题目描述 1.2题…

phpstudy 搭建 upload-labs 文件上传靶场

phpstudy 搭建靶场&#xff1a;下载安装好phpstudy后&#xff0c;下载靶场源码&#xff1a; upload-labs下载地址&#xff1a; https://github.com/c0ny1/upload-labs 下载完压缩文件&#xff0c;解压文件&#xff0c;解压后的文件夹命名为upload--labs 将解压后到文件夹放…

python 关键字(import)

4、import 在Python编程中&#xff0c;import 是一个至关重要的关键字&#xff0c;它用于导入其他Python模块或库中的代码&#xff0c;以便在当前程序中使用。无论是Python新手还是经验丰富的开发者&#xff0c;都需要对import有深入的理解。 基础知识&#xff1a;import 的基…

docker如何生成springboot镜像

1、在springboot的jar包所在的目录下创建Dockerfile文件&#xff0c;此案例的目录为/usr/java Dockerfile的文件内容如下&#xff1a; FROM openjdk:8 LABEL author"zengyanhui" LABEL email"1181159889qq.com" WORKDIR /usr/java/springbootdemo COPY s…

路径规划 | 详解混合A*算法Hybrid A*(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 为什么需要Hybrid A*算法?2 Hybrid A*算法原理2.1 基本流程2.2 运动学约束启发式2.3 基于维诺图的路径耗散2.4 连续性节点扩展3 算法仿真3.1 ROS C++ 仿真3.2 Python仿真3.3 Matlab仿真0 专栏介绍 🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、…

负债56亿,购买理财产品遭违约,操纵虚假粉丝,流量在下滑,客户数量减少,汽车之家面临大量风险(六)

本文由猛兽财经历时5个多月完成。猛兽财经将通过以下二十二个章节、8万字以上的内容来全面、深度的分析汽车之家这家公司。 由于篇幅限制&#xff0c;全文分为&#xff08;一&#xff09;到&#xff08;十&#xff09;篇发布。 本文为全文的第十四章、第十五章、第十六章。 目…

机器人系统ros2-开发实践04-ROS 2 启动文件管理大型项目的最佳实践

机器人上的大型应用通常涉及多个互连的节点&#xff0c;每个节点可以有许多参数。海龟模拟器中模拟多只海龟就是一个很好的例子。海龟模拟由多个海龟节点、世界配置以及 TF 广播器和监听器节点组成。在所有节点之间&#xff0c;存在大量影响这些节点的行为和外观的 ROS 参数。 …

《与 Apollo 共创生态——Apollo7周年大会干货分享》

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 阿波罗X企业自动驾驶解决方案自动驾驶技术提升与挑战自动驾驶系统功能与性能的详细解析<td alig…

python可视化学习笔记折线图问题-起始点问题

问题描述&#xff1a; 起始点的位置不对 from pyecharts.charts import Line import pyecharts.options as opts # 示例数据 x_data [1,2,3,4,5] y_data [1, 2, 3, 4, 5] # 创建 Line 图表 line Line() line.add_xaxis(x_data) line.add_yaxis("test", y_data) li…

数字阅览室的优势

近年来&#xff0c;随着我国社会经济的快速发展&#xff0c;信息技术的发展也得到了广泛的应用&#xff0c;我国高校图书馆和图书管理系统进入了快速发展的快车道。在这种环境下&#xff0c;数字化阅览室在校园中非常流行。数字阅览室是一套真正意义上的面向中小学图书管理、浏…

Golang | Leetcode Golang题解之第58题最后一个单词的长度

题目&#xff1a; 题解&#xff1a; func lengthOfLastWord(s string) (ans int) {index : len(s) - 1for s[index] {index--}for index > 0 && s[index] ! {ansindex--}return }

系统设计与建模

2022年DFD、E-R、数据流图和数据字典在需求分析和设计阶段的作用2021年用例图、顺序图、协作图与顺序图的区别 对象模型、动态模型、功能模型 2020年逻辑数据模型设计过程包含的任务、超类实体、派生属性2019年DFD、数据流图和系统流程图的区别2018年DFD、E-R、实体与类的区别2…

python基础语法--函数

一、函数概述 函数就是执行特定任务完成特定功能的一段代码。可以在程序中将某一段代码定义成函数&#xff0c;并指定一个函数名和接收的输入&#xff08;参数&#xff09;&#xff0c;这样就可以在程序的其他地方通过函数名多次调用并执行该段代码了。 每次调用执行后&#…

【华为】路由综合实验(基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP&#xff0c;使AR4和AR3成为eBGP&#xff0c;AR4和AR5成为iBGP对等体…

AI 图像无损放大器:多平台支持,轻松上手 | 开源日报 No.241

upscayl/upscayl Stars: 25.5k License: AGPL-3.0 upscayl 是一个免费开源的 AI 图像放大器&#xff0c;支持 Linux、MacOS 和 Windows 平台&#xff0c;并且秉承着“Linux 优先”理念构建。 使用先进的 AI 算法对低分辨率图像进行放大和增强在不损失质量的情况下放大图像&am…

ubuntu开启message文件

环境&#xff1a;ubuntu 20.04 1、首先需要修改 /etc/rsyslog.d/50-default.conf 文件&#xff1b;源文件中message被注释&#xff0c;如下图&#xff1a; 2、打开注释&#xff1a; 3、重启服务 systemctl restart rsyslog.service 如此即可&#xff01;

python Django REST framework允许你根据API的版本提供不同的行为或数据

在Django REST framework中,版本控制是一个重要的功能,它允许你根据API的版本提供不同的行为或数据。以下是如何在Django REST framework中设置API版本控制的几种方法: 1. 使用URL路径参数 你可以通过URL路径中的参数来指定API的版本。例如: python复制 # urls.py from …

开源库交叉编译(四)--- OpenSSH

官网&#xff1a;https://www.openssh.com/ 下载&#xff1a;http://www.openssh.com/portable.html#ftp 源码&#xff1a;openssh-9.0.tar.gz OpenSSH 依赖 zlib 和 OpenSSL &#xff0c;需先交叉编译 zlib 和 OpenSSL。 Step 1&#xff1a;解压源码 tar -xvzf openssh-9…