经典贪心算法: 最大不相交区间数量
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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具