poj 1089 Intervals
/*
题目:
下列区间可以在数轴上分成最少多少个区间块
分析:
这题主要是贪心的做法,对输入的区间按照左边的值进行排序后,然后开始向后枚举每个后面的区
间的前边的值是否小于等于起初的最大能到右面的最大值,符合的话,在更新一下起初的能到达右
面的最大距离,比如 2-5 4-8的话,由于第一个的右值为5,而枚举到第二个区间时,4<5,而8比5大,
所以又可以到达8,更新一下,具体看代码
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define X 50002
struct node
{
int x,y;
friend bool operator <(node a,node b)//重载符号,排序时使用
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
}p[X];
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
sort(p,p+n);
int temp = p[0].y,pre = p[0].x;//右最大值,左起始值
for(int i=1;i<n;i++)
{
if(p[i].x<=temp)//枚举到的区间左值能够被前面的右最大值覆盖到的话,更新右最大值
temp = max(temp,p[i].y);
else//否则的话,输出并且更新起始值和右最大值
{
printf("%d %d\n",pre,temp);
temp = p[i].y;
pre = p[i].x;
}
}
printf("%d %d\n",pre,temp);
}
return 0;
}