给定N个闭区间[ai,bi]以及一个线段区间[s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。
输出最少区间数,如果无法完全覆盖则输出-1。
输入格式
第一行包含两个整数s和t,表示给定线段区间的两个端点。
第二行包含整数N,表示给定区间数。
接下来N行,每行包含两个整数ai,bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示所需最少区间数。
如果无解,则输出-1。
数据范围
1≤ N ≤10^5,
−10^9≤ ai ≤ bi ≤10^9,
−10^9≤ s ≤ t ≤10^9
输入样例:
1 5
3
-1 3
2 4
3 5
输出样例:
2
区间覆盖问题: 每次找的是:在包含待覆盖区间左端点的区间中右端点最大的那个区间。 右端点最大就意味着右端点离待覆盖区间左端点的距离最大(最远),也就是这次选择这个区间是最值的。
区间按照左端点排序
#include<iostream>
#include<algorithm>
using namespace std;
struct range{
int st;
int ed;
bool operator < (const range &b) const{
return st < b.st;
}
}a[100010];
int main(){
int n,s,e,l,r;
cin>>s>>e>>n;
for (int i = 0 ; i < n; ++i){
cin>>l>>r;
a[i] = {l,r};
}
sort(a, a + n);
int res = 0;
for (int i = 0; i < n; ++i){
int j = i,max_r = -1e9;
while(j < n && a[j].st <= s){
max_r = max(max_r,a[j].ed);
++j;
}
if (max_r < s){
cout<<-1<<endl;
return 0;
}
res++;
if (max_r >=e){
cout<<res<<endl;
return 0;
}
s = max_r;
i = j - 1;
}
return 0;
}