poj 1089 区间问题 -- 水题一道

/*
 *  poj 1089 区间问题

    题目大意:
        数轴上n个区间,将有交叠的合并,最终按照升序输出各合并后的区间

    解题思路:
        题目很简单,算法也中规中矩

        1、将各区间按照起始点从小到大排序

        2、从前到后扫描相邻区间,如果有交叠则合并,否则视为下一个独立区间,同时输出上个独立区间
*/

#include <iostream>
#include <cstdio>
#include <cstdlib>

namespace {
    using namespace std;

    const int N_MAX = 50000;

    typedef struct INTERVAL
    {
        int s, e;
    }INTERVAL_S;

    INTERVAL_S g_aIntervals[N_MAX]; // 读入区间数

    // 区间数比较函数
    int interval_cmp(const void *pOP1, const void *pOP2)
    {
        INTERVAL_S *pInterval1, *pInterval2;

        pInterval1 = (INTERVAL_S *)pOP1;
        pInterval2 = (INTERVAL_S *)pOP2;

        if (pInterval1->s < pInterval2->s)  return -1;
        if (pInterval1->s == pInterval2->s) return  0;
        if (pInterval1->s > pInterval2->s)  return  1;
    }
}

int main()
{
    int n;
    scanf("%d", &n);

    for (int i=0; i<n; i++)
    {
        scanf("%d %d", &g_aIntervals[i].s, &g_aIntervals[i].e);
    }

    // 以起点从小到大排序
    qsort(g_aIntervals, n, sizeof(g_aIntervals[0]), interval_cmp);

    INTERVAL_S cur_interval; // 当前处理区间

    // 从前向后线性扫描
    int i = 0;
    while (i<n)
    {
        cur_interval = g_aIntervals[i];

        // 一个区间的处理
        int j = i+1;
        while (j<n && g_aIntervals[j].s<=cur_interval.e)
        {
            if (g_aIntervals[j].e > cur_interval.e)
                cur_interval.e = g_aIntervals[j].e;
                
            ++j;
        }
        
        // 打印之
        printf("%d %d\n", cur_interval.s, cur_interval.e);

        i = j;
    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值