acwing907. 区间覆盖

分析

将所有区间按l从小到大排序,要用最少的区间数覆盖目标区间,每次合并时选择满足条件的最大值即可。

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;

struct Range{
    int l,r;
    bool operator < (const Range &w)const{
        return l<w.l;
    }
}range[N];
int main(){
    int st,ed,n;
    cin>>st>>ed;
    cin>>n;
    for(int i=0;i<n;i++)cin>>range[i].l>>range[i].r;
    sort(range,range+n);
    int res=0;
    bool success=false;
    for(int i=0;i<n;i++){
        int j=i,r=-2e9;
        while(j<n&&range[j].l<=st){//找到所有包括st的最大r的区间
            r=max(r,range[j].r);
            j++;
        }
        if(r<st){//所有区间都<st,直接退出
            res=-1;
            break;
        }
        res++;
        if(r>=ed){
            success=true;
            break;
        }
        st=r;
        i=j-1;//由于前面range[j].l<=st,所以此时i要-1
    }
    if(!success)res=-1;
    cout<<res<<endl;
    
    
    return 0;
}