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;

}

 

posted @ 2012-04-06 15:42  yejinru  阅读(208)  评论(0编辑  收藏  举报