AcWing 906. 区间分组 (区间贪心问题)

简介: 笔记

AcWing 906. 区间分组


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

输出最小组数。


输入格式

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


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


输出格式

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


数据范围

1.png


思路

①将所有区间按左端点从小到大排序


②从前往后处理每个区间2.pngans为最优解cnt为可行解 ∴ \therefore∴ans<=cnt


而可行解的每个分组里至少有一个区间 可能有多个区间 ∴ \therefore∴ans>=cnt


∴ \therefore∴ ans==cnt


PS:按照左端点从小到大排序 当前区间的左端点≥ \geq≥上一个区间的左端点 如果其左端点≤ \leq≤上一区间右端点 则一定有交点 不能放在一组


代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 100010;
int n;
struct Range {
  int l, r;
}range[N];
bool cmp(struct Range a, struct Range b) {
  return a.l < b.l;
}
int main() {
  cin >> n;
  for (int i = 0; i < n; ++i) {
    scanf("%d%d", &range[i].l, &range[i].r);
  }
  sort(range, range + n, cmp);
  priority_queue<int, vector<int>, greater<int> >heap;
  for (int i = 0; i < n; ++i) {
    auto r = range[i];
    if (heap.empty() || heap.top() >= r.l)heap.push(r.r);
    else {
      heap.pop();
      heap.push(r.r);
    }
  }
  cout << heap.size() << endl;
  return 0;
}


目录
相关文章
|
6月前
leetcode-435:无重叠区间
leetcode-435:无重叠区间
32 0
|
1月前
acwing 836 合并区间
acwing 836 合并区间
13 1
acwing 836 合并区间
|
6月前
|
算法 测试技术 C#
【线段树】2276. 统计区间中的整数数目
【线段树】2276. 统计区间中的整数数目
|
人工智能 BI 索引
【Leetcode -598.范围求和Ⅱ -599.两个列表的最小索引总和】
【Leetcode -598.范围求和Ⅱ -599.两个列表的最小索引总和】
43 0
|
6月前
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
50 0
|
6月前
|
算法 测试技术 C#
二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目
二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目
|
6月前
|
C++
汇总区间(C++)
汇总区间(C++)
54 0
|
11月前
|
算法 测试技术 C#
C++ 算法:区间和的个数
C++ 算法:区间和的个数
|
人工智能 算法 BI
贪心算法——区间选点与最大不相交区间数
贪心算法——区间选点与最大不相交区间数
68 0
【LeetCode 327】区间和的个数
【LeetCode 327】区间和的个数
107 0