题目
来源:AcWing
给定N个闭区间[ai, bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。
输出最小组数。
输入格式
第一行包含整数N,表示区间数。
接下来N行,每行包含两个整数ai,bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示最小组数。
数据范围
1≤N≤105
−109≤ai≤bi≤109
输入样例
输出样例
思路
1 2 3 4 5
| 存储所有区间,并按区间左端点从小到大排序 建立小根堆(优先队列)用于存储所有区间分组(仅存储分组的右端点) 遍历所有区间: 如果区间左端点≤堆的根节点,即该区间与所有分组都有交点,那么将该区间添加成新的分组 否则将该区间并入根节点的分组
|
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include<bits/stdc++.h> using namespace std;
typedef pair<int, int> PII;
const int N = 100010; PII q[N];
int main() { int n, l, r; scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d%d", &l, &r); q[i] = {l, r}; } sort(q, q + n); priority_queue<int, vector<int>, greater<int>> heap; heap.push(q[0].second); for(int i = 1; i < n; i++) { auto x = heap.top(); if(q[i].first <= x) { heap.push(q[i].second); } else { heap.pop(); heap.push(q[i].second); } } printf("%d", heap.size()); return 0; }
|
大佬的解法
转自:https://www.acwing.com/solution/content/8902/
看了一下,貌似是求最大”区间厚度的问题。
大家可以把这个问题想象成活动安排问题
有若干个活动,第i个开始时间和结束时间是[Si,fi],同一个教室安排的活动之间不能交叠,求要安排所 有活动,少需要几个教室?
有时间冲突的活动不能安排在同一间教室,与该问题的限制条件相同,即最小需要的教室个数即为该题答案。
我们可以把所有开始时间和结束时间排序,遇到开始时间就把需要的教室加1,遇到 结束时间就把需要的教室减1,在一系列需要的教室个数变化的过程中,峰值就是多同时进行的活动数,也是我们至少需要的教室数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <iostream> #include <algorithm>
using namespace std;
const int N = 100100;
int n;
int b[2 * N], idx;
int main() { cin >> n; for(int i = 0; i < n ; i ++) { int l, r; scanf("%d %d", &l, &r); b[idx ++] = l * 2; b[idx ++] = r * 2 + 1; }
sort(b, b + idx);
int res = 1, t = 0;
for(int i = 0; i < idx ; i ++) { if(b[i] % 2 == 0) { t ++; } else t --;
res = max(res, t); } cout << res << endl; return 0; }
|