成仙之路−> 算法基础课题解
思路:
1. 先将所有区间按左端点进行排序
2. 覆盖的含义:该区间的左端点小于等于 st
3. 依次枚举每个区间,在所有能够覆盖 st 的区间中找到最大的右端点,并将 st 更新为该右端点
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int st,ed,n;
struct Range
{
int l,r;
bool operator< (const Range &w)const
{
return l<w.l;
}
}range[N];
int main()
{
cin>>st>>ed>>n;
for(int i=0;i<n;i++)
{
int l,r;
cin>>l>>r;
range[i]={l,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=max(r,range[j].r);
j++;
}
if(r<st) break; //能覆盖st的区间的最大的右端点实际上并不能覆盖st
res++; //区间计数
st=r; //将st更新为能覆盖st的区间的最大右端点
if(st>=ed) //该右端点能够覆盖终点
{
success=true; //成功的标志
break;
}
i=j-1;
}
if(!success) res=-1;
cout<<res<<endl;
return 0;
}