1089 Intervals

题目大意:

给定n个区间,求他们的并,用最少的区间表示

考虑2个区间的位置关系,只有5种

先按区间左端点增序排

从左到右O(n)扫一遍

第i个区间右端点比当前处理区间右端点大,而且他们相交,则更新当前处理区间的右端点

第i个区间和当前处理区间不交,则产生新区间,输出,并更新当前处理区间的左右端点

  1. //4471891_AC_125MS_792K
  2. /**********************************************************************
  3. *       Online Judge   : POJ
  4. *       Problem Title  : Intervals
  5. *       ID             : 1089
  6. *       Date           : 12/10/2008
  7. *       Time           : 7:47:11
  8. *       Computer Name  : EVERLASTING-PC
  9. ***********************************************************************/
  10. #include<iostream>
  11. #include<algorithm>
  12. using namespace std;
  13. #define MAXN 50000
  14. struct Interval
  15. {
  16.     int s,e;
  17. };
  18. bool cmp(Interval a,Interval b)
  19. {
  20.     return a.s<b.s;
  21. }
  22. Interval a[MAXN];
  23. int n,ss,ee;
  24. int main()
  25. {
  26.     //freopen("in_1089.txt","r",stdin);
  27.     while (scanf("%d",&n)!=-1)
  28.     {
  29.         for (int i=0;i<n;++i)
  30.         {
  31.             scanf("%d%d",&a[i].s,&a[i].e);
  32.         }
  33.         sort(a,a+n,cmp);
  34.         ss=a[0].s;
  35.         ee=a[0].e;
  36.         for (int i=1;i<n;++i)
  37.         {
  38.             if (a[i].s<=ee&&ee<a[i].e)
  39.             {
  40.                 ee=a[i].e;
  41.             }
  42.             else if(ee<a[i].s)
  43.             {
  44.                 printf("%d %d/n",ss,ee);
  45.                 ss=a[i].s;
  46.                 ee=a[i].e;
  47.             }
  48.         }
  49.         printf("%d %d/n",ss,ee);
  50.     }
  51.     return 0;
  52. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值