思路:
每次选择左端点小于线段区间的左端点(可以覆盖)并且右端点最大的闭区间(覆盖面积最大)
然后用右端点更新线段区间的左端点
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N = 1e5+7;
PII c[N];
int s,t,n,cnt;
//按照左端点从小到大排序
int cmp(PII a,PII b)
{
if(a.first!=b.first)return a.first<b.first;
}
int main()
{
scanf("%d%d",&s,&t);
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
c[i]={a,b};
}
sort(c,c+n,cmp);
//闭区间最小的左端点都大于线段区间的左端点,则不可能覆盖
if(c[0].first>s)cout<<-1;
else
{
int i,j;
for(i=0;i<n;i++)
{
if(s>=t)break;
int a=s,j=i;
while(j<n&&c[j].first<=s)
{
a=max(a,c[j].second);
j++;
}
//如果闭区间没有小于线段区间左端点时,则不可能覆盖(中间断了)
if(i==j)break;
i=j-1;
cnt++;
//将最大的闭区间右端点更新线段区间左端点
s=a;
}
if(s>=t)cout<<cnt;
else cout<<-1;
}
return 0;
}