POJ 1089 Intervals 区间覆盖+ 贪心
2012-08-25 09:21 javaspring 阅读(422) 评论(0) 编辑 收藏 举报来源:http://poj.org/problem?id=1089
题意:就是给你一些区间,若两个区间能够合并,则合并。求最后又多少个区间,输出最后的区间。
思路:其实就是一个贪心的题目,不过要想做到1A还是有点困难的。有许多情况需要考虑清楚,我也是wa了几次才过的。我们可以先按开始端点从小到大排序,若开始端点相等,则按结尾端点从小到大排序。排序之后能合并则合并。合并的时候有两种情况,一种是起点和开始点的起点一样,但是终点比开始点的终点大,这种情况需要考虑;另一种就是开始点小于等于起点的结束点。在合并的过程中,起点的结尾点需要一直不断的更新。
代码:
#include <iostream> #include <cstdio> #include <string.h> #include <climits> #include <algorithm> using namespace std; #define CLR(arr,val) memset(arr,val,sizeof(arr)) const int N = 50010; struct interval{ int st,et; }aa[N]; int flag[N]; bool cmp(interval a,interval b){ if(a.st == b.st ) return a.et < b.et; return a.st < b.st; } int max(int a,int b){ return a > b ? a : b; } int main(){ //freopen("1.txt","r",stdin); int n; while(scanf("%d",&n) != EOF){ for(int i = 0;i < N; ++i){ aa[i].st = aa[i].et = INT_MAX; } CLR(flag,0); for(int i = 0; i < n; ++i) scanf("%d%d",&aa[i].st,&aa[i].et); sort(aa,aa+n,cmp); int id; for(int i = 0; i < n; ){ id = i; printf("%d ",aa[id].st); while(aa[i+1].st == aa[id].st){ i++; } aa[id].et = aa[i].et; while(aa[i+1].st <= aa[id].et){ i++; if(aa[i].et > aa[id].et) aa[id].et = aa[i].et; } if(aa[i].et > aa[id].et) aa[id].et = aa[i].et; printf("%d\n",aa[id].et); i++; } } return 0; }