poj2376
2015-11-25 10:24
204 查看
链接:点击打开链接
题意:有n个区间,问最少需要其中几个区间才能完全覆盖区间[1,T],如不能输出-1
代码:
题意:有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; }
相关文章推荐
- 递归调用,汉诺塔问题
- Spark初体验(1)--SparkPi详解
- 计量模块 Ceilometer 介绍及优化
- 取经人
- jQuery官网下载步骤
- 发送手机验证码
- Git详解之三 Git分支
- C#实现流程图设计器
- IOS 和 Android Unity游戏引擎的集成AdMob新版教程
- mac 下安装 plink
- Anaconda2-spyder中Ipython console显示connecting to kernel
- Unix目录结构的来历
- Android studio 2.0 预览版发布
- 【转】CSS网页布局DIV水平居中的各种方法
- windos7升级powershell到4.0版本步骤
- sysv-rc-conf 和chkconfig 服务管理命令的使用
- Linux 虚拟机之--KVM的安装和配置(一)
- linux 进入包含空格文件名的文件夹
- iOS中,MRC和ARC混编
- unity3d 代码导出unity包