思路如下,
首先看最大的和最小是否把1到t包含,如果不能包含,输出-1
剩下的就贪心,在s小于当前的e+1时找最大的e,如果找不到,就退出,输出-1
否则就输出结果。
代码如下
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node
{
int s,e;
}a[25005],temp;
bool cmp(Node a,Node b)
{
if(a.s!=b.s)
return a.s<b.s;
else
return a.e<b.e;
}
int main()
{
int n,t;
scanf("%d %d",&n,&t);
int mi=1000005,ma=0;
for(int i=0;i<n;i++){
scanf("%d %d",&a[i].s,&a[i].e);
mi=min(mi,a[i].s); ma=max(ma,a[i].e);
}
if(mi>1||ma<t) printf("-1\n");
else{
sort(a,a+n,cmp);
temp=a[0];
for(int i=0;i<n;i++)
{
if(a[i].s!=a[0].s) break;
temp=a[i];
}
int flag=0;
int cnt=1;
while(temp.e<t&&flag==0){
cnt++;
int p=-1,ee=temp.e;
for(int i=0;i<n;i++)
{
if(a[i].s>temp.e+1) break;
if(a[i].e>ee) {
ee=a[i].e; p=i;
}
}
if(p==-1) flag=1;
else{
temp=a[p];
}
}
if(flag==1) printf("-1\n");
else printf("%d\n",cnt);
}
}