您的位置:首页 > 其它

poj2376

2015-11-25 10:24 204 查看
链接:点击打开链接

题意:有n个区间,问最少需要其中几个区间才能完全覆盖区间[1,T],如不能输出-1

代码:
#include <vector>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
struct node{
int x,y;
};
bool cmp(node a,node b){
if(a.x==b.x)
return a.y>b.y;
return a.x<b.x;
}
int main(){
node s[25005];
int N,T,i,j,r,ans,sign,temp;
while(scanf("%d%d",&N,&T)!=EOF){
for(i=0;i<N;i++)
scanf("%d%d",&s[i].x,&s[i].y);
s[i].x=INF;
sort(s,s+N,cmp);            //先按x,y排序
if(s[0].x!=1){              //第一个不是1则直接输出-1
puts("-1");
continue;
}
r=s[0].y;ans=1;temp=sign=0;
if(r==T){
puts("1");
continue;
}
for(i=1;i<=N;i++){
if(s[i].x<=r+1){
if(temp<s[i].y)     //找出当s[i].x<=r+1时最远的右边界值
temp=s[i].y,sign=1;
if(s[i+1].x>r+1&&sign==1)
r=temp,ans++,sign=0;//当s[i+1].x>r+1时,也就是s[i+1]不在于当前区间
}                       //重叠时,则更换最大右界
}
if(r<T)
puts("-1");
else
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: