Description
Input
Output
Sample Input
3 10
1 7
3 6
6 10
Sample Output
2
Hint
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node{
int x,y;
}e[25005];
bool cmp(node a,node b){
if(a.x==b.x)return a.y>b.y;
return a.x<b.x;
}
int main(){
int n,m,i,j;
cin>>n>>m;
for(i=1;i<=n;i++){
scanf("%d%d",&e[i].x,&e[i].y);
}
sort(e+1,e+1+n,cmp);//排序
e[n+1].x=9999999;
int ans=0,t=0,temp=0,f=0;//ans代表数量,t代表当前线段的最右端,temp代表t-i中右端最远的线段标号,f代表当前有没有线段可用
for(i=1;i<=n;i++){
if(t+1>=e[i].x){//如果当前线段的右端+1到达了当前线段的左端右边,那么
if(temp<e[i].y){//寻找最右端的线段
temp=e[i].y;
f=1;
}
if(e[i+1].x>t+1&&f){//如果下一条线段的开始点已经大于当前线段的结束点+1,那么就把前面右端最远的线段用掉
ans++;
f=0;
t=temp;
}
}
}
if(t<m)cout<<"-1"<<endl;
else cout<<ans<<endl;
return 0;
}原文:http://blog.csdn.net/black_miracle/article/details/51354371