其他分享
首页 > 其他分享> > AcWing 907. 区间覆盖 题解 贪心

AcWing 907. 区间覆盖 题解 贪心

作者:互联网

题目

在这里插入图片描述


思路

在这里插入图片描述


代码

#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 n,a,b;
int main()
{
    int st,ed;
    scanf("%d%d%d",&st,&ed,&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&a,&b);
        range[i]={a,b};
    }
    sort(range,range+n);  //把区间按左端点从小到大排序
    int res=0,r;   //res记录区间个数
    bool success=false;  //success标记是否找到了解
    for(int i=0;i<n;i++)
    {
        int j=i;
        r=-2e9;  //为了让i一开始能取初值
        while(j<n&&range[j].l<=st)    //找到能够覆盖start的区间中右端点最大的
        {
            r=max(r,range[j].r);
            j++;
        }
        if(r<st)    //如果符合条件的右端点比给出区间的左端点还要小,那肯定无解
        {
            res=-1;
            break;
        }
        res++;   //先把方案数++
        if(r>=ed)   //如果当前选择的区间的右端点已经比给定区间的大或者相等了,说明已经找到了答案
        {
            success=true;
            break;
        }
        st=r;  //把st更新成当前选中区间的右端点
        i=j-1;  //因为上面i要++,所以这里先把j--,防止i+了两次
    }
    if(!success) printf("-1");
    else printf("%d",res);
    return 0;
}

标签:907,success,int,题解,st,++,range,res,AcWing
来源: https://blog.csdn.net/weixin_45798993/article/details/123168301