区间选点问题-贪心-C++

news/2024/9/23 18:28:23/

 问题:

给定 𝑁 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。

输出选择的点的最小数量。

位于区间端点上的点也算作区间内。

输入格式

第一行包含整数 𝑁,表示区间数。

接下来 𝑁 行,每行包含两个整数 𝑎𝑖,𝑏𝑖,表示一个区间的两个端点。

输出格式

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

数据范围

1≤N≤10^5,
−10^9≤𝑎𝑖≤𝑏𝑖≤10^9

输入样例:
3
-1 1
2 4
3 5

 代码:

#include<iostream>
#include<algorithm>
using namespace std;
using Pii = pair<int, int>;
const int N = 100010;
Pii Range[N];
int main(){int n;cin >> n;for (int i = 0; i < n;i++){cin >> Range[i].first >> Range[i].second;}sort(Range, Range + n, [](const Pii &a, const Pii &b) -> bool{ return a.second < b.second; });int ed = -2e9, res = 0;for (int i = 0; i < n;i++){if(Range[i].first>ed){res++;ed = Range[i].second;}}cout << res << endl;
}

题解:
        题意就是给你10^5以下个区间,所以我们const int N = 100010;让你在数轴上选择一些点,这些点要能覆盖得到所有的区间,当然了,数量越少越好:

        以此图为例子,灰色笔画的这两个点就是答案,你再也不可能找到更少的点来覆盖每个区间了。

        计算机并不容易比我们更容易地判断出结果,我们可以先排个序看看:
         我们暂且以每个区间的右端点的由小而大来排序,我们如果以每个区间的右端点来设点,其实更有可能让这个点覆盖到下一个区间甚至下下一个区间,这样更可能满足要求,这是贪心的思想,即:短视地选择我们遍历的区间的右端点作为答案,然后妄想让它尽可能地覆盖下一个、下下一个点......

        我们还发现:如果A区间的右端点在下一个区间(记为B)的左端点之右的话,那么我们把A区间的右端点放到答案中,它不仅可以覆盖A区间,连B区间都覆盖了,甚至满足条件它连C区间也可以给覆盖了......我们只需维护一个变量ed记为我们刚埋的点,刚开始这个ed我们赋值为负无穷,

遇到一个区间,如果它的左端点比ed还小,那说明不用管它了,ed完全可以覆盖它,否则,说明这一个区间我们ed够不着,需要在这个区间设点了,即把这个区间的右端点作为新的ed,让他去在遍历下一个区间时,看能不能不设点,ed就能覆盖下一个区间。

        总之,遇到区间问题,尽量想到排序,贪心.....

参考链接:链接


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

相关文章

leetcode-主持人调度(二)-110

题目要求 思路 1.先将开始时间和结束时间拆分放到两个数组中进行排序 2.如果开始的时间小于结束时间&#xff0c;说明目前没有空闲的人&#xff0c;需要增加人&#xff0c;如果大于等于&#xff0c;说明有人刚结束了主持&#xff0c;可以进行新的主持了&#xff0c;变更到下一…

如何学到数据库从入门到入土(MySQL篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

PostgreSQL的版本号规则

PostgreSQL的版本号规则 PostgreSQL 版本号规则在随着时间的推移有所变化&#xff0c;以便更好地反映功能和修补版本的发布。以下是 PostgreSQL 版本号的规则&#xff0c;以及在不同阶段所采用的版本号规范。 版本号规则 从 PostgreSQL 10 开始&#xff0c;版本号采用了 MAJ…

Unity 自定义Web GL 发布模板

前言 使用讯飞语音识别时&#xff0c;发布Web GL 平台后需要在index.html 中添加相应的script 标签&#xff0c;但每次发布完添加比较麻烦&#xff0c;添加一个发布模板就可以不必每次发布完再手动添加修改。 实现 在Assets 文件夹下新建一个文件夹&#xff0c;重命名为WebG…

轻松入门Linux命令行(一)

1. 打开终端 在Linux系统中&#xff0c;我们可以通过终端&#xff08;Terminal&#xff09;来执行各种命令。不同的Linux发行版可能有不同的终端程序&#xff0c;但通常都可以在应用程序菜单中找到。打开终端后&#xff0c;我们就可以看到一个命令行提示符&#xff0c;等待我们…

不怕YOLOv10高歌猛进,我有YOLOv8稳扎稳打

YOLOv10 出来有几天时间了&#xff0c;这次我没有选择第一时间出文章解析&#xff0c;如此频繁的发布数字版本的 YOLO 着实让人头疼&#xff0c;虽然数字的更新并非旧版技术的过时&#xff0c; 但是这肯定会让很多在校同学增加很多焦虑情绪。这里还是请大家辩证看待。 v10 这次…

第三方软件检测机构要具备哪些资质要求?专业测试报告如何申请?

第三方软件检测机构是独立于软件开发商和用户之外的公正机构&#xff0c;负责对软件进行全面的检测和评估。其独立性保证了评测结果的客观性和公正性&#xff0c;有效避免了软件开发商对自身产品的主观偏见和误导。 要成为一家合格的第三方软件检测机构&#xff0c;需要具备一…

CTFHUB技能树——SSRF(二)

目录 上传文件 ​FastCGI协议 Redis协议 上传文件 题目描述&#xff1a;这次需要上传一个文件到flag.php了.祝你好运 index.php与上题一样&#xff0c;使用POST请求的方法向flag.php传递参数 //flag.php页面源码 <?phperror_reporting(0);if($_SERVER["REMOTE_ADDR&…