标签:str color turn oid har 空格 obj 表示 strong
给定 n 个闭区间 [ai; bi],其中i=1,2,...,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1;2] 和 [2;3] 可以合并为 [1;3],[1;3] 和 [2;4] 可以合并为 [1;4],但是[1;2] 和 [3;4] 不可以合并。
我们的任务是判断这些区间是否可以最终合并为一个闭区间,如果可以,将这个闭区间输出,否则输出no。
5 5 6 1 5 10 10 6 9 8 10
1 10
1 #include<stdio.h> 2 #include<stdlib.h> 3 struct obj 4 { 5 int L,R; 6 }data[50005]; 7 8 int cmp(const void *a,const void *b)//按左端点升序排序。左端点相等则按右端点降序排序。 9 { 10 struct obj x,y; 11 x=*(struct obj*)a; 12 y=*(struct obj*)b; 13 if(x.L>y.L) return 1;//需要交换 14 else if(x.L<y.L) return 0;//不需要交换 15 else if(x.R<y.R) return 1;//需要交换 16 else return 0;//不需要交换 17 } 18 int main(int argc, char *argv[]) 19 { 20 int n,i; 21 int left,right; 22 int count; 23 freopen("6.in","r",stdin); 24 scanf("%d",&n); 25 for(i=0;i<n;i++) 26 scanf("%d%d",&data[i].L,&data[i].R); 27 28 qsort(data,n,sizeof(data[0]),cmp); 29 30 count=1; 31 left=data[0].L;//最靠左的端点 32 right=data[0].R;//目前最靠右边的端点。每次需要拿扫描到的区间与之比较从而决定是否能把该区间合并进来。合并后可能需要更新right。 33 for(i=1;i<n;i++) 34 { 35 if(data[i].L<=right) count++; 36 if(data[i].R>right) right=data[i].R; 37 } 38 if(count==n)printf("%d %d\n",left,right); 39 else printf("no\n"); 40 return 0; 41 }
应该与之前出现的最大的右端点作比较,而不是与上一个右端点作比较
最后统计合并的区间的个数。假如合并的区间个数是n即可。
标签:str color turn oid har 空格 obj 表示 strong
原文地址:http://www.cnblogs.com/huashanqingzhu/p/7041516.html