poj 1089 区间问题 -- 水题一道
2012-05-16 00:53
375 查看
/* * 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; }
相关文章推荐
- poj 1089 贪心之区间覆盖问题
- poj 1089 Intervals(区间合并问题)
- POJ水题1083区间重叠问题
- NYOJ1036 非洲小孩(又一道贪心水题,区间选点问题)
- 10148 - Advertisement-----贪心,区间选点问题------水题
- POJ 3162 浅谈尺取法区间问题运用及多源树上路径统计
- POJ-2777 Count Color(线段树,区间染色问题)
- POJ 3422 Kaka's Matrix Travels(模型转化 区间K覆盖问题)
- POJ 1328 && NYOJ 891 - 贪心 区间选点问题
- hdu_1048_The Hardest Problem Ever_字符输入输出问题水题一道
- POJ-2777 Count Color(线段树,区间染色问题)
- POJ 2528 Mayor's posters 【线段树(区间为节点问题)】
- POJ 3264 ST表(RMQ问题:查询区间最大最小值)
- POJ 1456 Supermarket 区间问题并查集||贪心
- 贪心问题:区间覆盖 POJ 1328 Rader Installation
- POJ 1003 Hangover 水题一道 练习C++编程
- poj 3264__Balanced Lineup(区间最值问题)
- Poj 1833 排列 —— 一道水题的凌乱
- poj 1738 An old Stone Game(区间dp 合并石子问题直线型)
- poj 1177 又是一道十分恶心到线段树。 主要是用线段树到区间操作。可以用来节省线性查找的时间。 离散化也十分好的一道题。