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