[题] 区间合并 #贪心 #队列

编程入门 行业动态 更新时间:2024-10-22 21:25:55

[题] 区间合并 #贪心 #<a href=https://www.elefans.com/category/jswz/34/1771257.html style=队列"/>

[题] 区间合并 #贪心 #队列

题目

区间合并


题解

称多个区间合并后的区间为:大区间。
操作:

  1. 输入所有区间后,按左端点排序。
  2. 维护一个装有区间的队列:
    对于新加入的区间,有以下两种情况:
    1.能合并。
    操作:合并,然后更新当前大区间的右端。
    2.不能合并。
    操作:结束上一个大区间,然后开始新的大区间。
  3. 注意对第0个大区间和最后一个大区间的操作。

代码

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
void merge(vector<PII> &segs) {vector<PII> res;sort(segs.begin(), segs.end());int st = -2e9, ed = -2e9;for (auto seg : segs) {//不能合并:结束当前大区间,开始新的大区间。 if (ed < seg.first) {//第0个大区间不算if (st != -2e9) //将当前大区间加入区间队列。 res.push_back({st, ed});//开始新的大区间。 st = seg.first, ed = seg.second;}else ed = max(ed, seg.second);}//注意对最后一个大区间进行处理。 if (st != -2e9)  res.push_back({st, ed});segs = res;
}
int main() {int n;scanf("%d", &n);vector<PII> segs;for (int i = 0; i < n; i ++ ) {int l, r;scanf("%d%d", &l, &r);segs.push_back({l, r});}merge(segs);cout << segs.size() << endl;return 0;
}

更多推荐

[题] 区间合并 #贪心 #队列

本文发布于:2023-12-03 20:33:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1657351.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:队列   区间   贪心

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!