经典贪心算法: 最大不相交区间数量

C++

最大不相交区间数量

/*
最大不相交区间数量
题目描述:
给定 N 个闭区间 [ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。
输出可选取区间的最大数量。
输入格式:
第一行包含整数 N,表示区间数。
接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示可选取区间的最大数量。
数据范围
1 ≤ N ≤ 10^5,
−10^9 ≤ ai ≤ bi ≤ 10^9
算法思路:
和算法区间选点的思路一模一样。
首先对区间按照 右端点为第二关键字,左端点为第一关键字进行从小到大进行排序(第二关键字必要不大)。
然后,我们选择第一个区间,按照序号继续便利,直到找到一个与其不相交的区间,然后加入,直到便利所有的区间。
算法证明:
该算法的证明可以通过替换法,我们可以一步步将任何一个最优解转换为算法计算出来的解。
*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef pair<int, int> PII;
const int N = 100010;
PII segments[N];
int n;
bool cmp(const PII &t1, const PII &t2) {
return t1.second < t2.second;
}
int solution_one() {
int cur_point = -2e9;
int cnt = 0;
sort(segments + 1, segments + 1 + n, cmp);
for (int i = 1; i <= n; i ++ ) {
if (segments[i].first > cur_point) {
cnt += 1;
cur_point = segments[i].second;
}
}
return cnt;
}
int main()
{
// input
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) {
scanf("%d%d", &segments[i].first, &segments[i].second);
}
int res = solution_one();
printf("%d\n", res);
return 0;
}
posted @   lucky_light  阅读(411)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示