思路:贪心算法,对于当前的起点st,我们每次从可以覆盖当前起点st的所有区间中选取右端点值最大的区间(这样所需要的区间数最少)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int st, ed, n;
cin>>st>>ed>>n;
vector<vector<int>> intervals;
for (int i = 0; i < n; i++){
int l, r;
cin>>l>>r;
intervals.push_back({l, r});
}
sort(intervals.begin(), intervals.end()); //按照区间左端点从小到大进行排序
int res = 0; //最少需要覆盖的区间数
bool success = false; //判断是否可以覆盖整个区间[st, ed]
for (int i = 0; i < n; i++){
int j = i, r = -2e9;
while(j < n && intervals[j][0] <= st){ //在所有可以覆盖起点st的区间中寻找右端点最大的那个区间
r = max(r, intervals[j][1]);
j++;
}
res++;
if (r < st){ //所有的区间都不能覆盖起点st,那么res = -1
res = -1;
break;
}
if (r >= ed){ //当前所选的区间已经可以覆盖整个区间[st, ed],那么就可结束了
success = true;
break;
}
st = r; //更新st为刚刚选取的右端点最大的那个值
i = j-1; //在这一步之后i++, i = j从上一次选取的右端点右边的区间开始选择
}
if (success) cout<<res<<endl;
else cout<<-1<<endl;
return 0;
}