#include<iostream>#include<algorithm>#include<queue>usingnamespace std;constint N =1e5+10;structrange{int l, r;booloperator< (constrange&a) const {return l <a.l; }}Range[N];intmain(){int n; cin >> n;for (int i =0; i < n; i ++) cin >>Range[i].l >>Range[i].r;sort(Range, Range + n); priority_queue<int, vector<int>, greater<int>> heap; for (int i =0; i < n; i ++){if (heap.empty() ||heap.top() >=Range[i].l) heap.push(Range[i].r);else{heap.pop();heap.push(Range[i].r); } } cout <<heap.size() << endl;}
区间覆盖
题意是选取尽可能少的区间来覆盖我们的目标区间。
排序。以右端点从小到大排序。
选取。考虑覆盖左端点的区间们,我们一定是选取右端点最大的那个区间,这样收益最大。
#include<iostream>#include<algorithm>usingnamespace std;constint N =1e5+10;structrange{int l, r;booloperator< (constrange&a) const {return l <a.l; }}Range[N];intmain(){int al, ar; cin >> al >> ar;int n; cin >> n;for (int i =0; i < n; i ++) cin >>Range[i].l >>Range[i].r;sort(Range, Range + n);int res =0;bool suc =false;for (int i =0; i < n; i ++){int j = i, r =-2e9;while (j < n &&Range[j].l <= al){ r =max(r,Range[j].r); j ++; }if (r < al)break; al = r; res ++;if (ar <= al){ suc =true;break; } i = j -1; }if (suc) cout << res << endl;else cout <<-1<< endl;}
给定 N 个闭区间 [ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。 输出可选取区间的最大数量。
给定 N 个闭区间 [ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。 输出最小组数。
本题可以抽象成活动安排问题,假设有 n 个活动其时间要求为一个区间来安排教室,求最小的教室数量。
给定 N 个闭区间 [ai,bi] 以及一个线段区间 [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。 输出最少区间数,如果无法完全覆盖则输出 −1。