escription | ||
题目描述在X轴上给你一些线段,问被这些线段覆盖的区间长。 输入每个样例的第一行是一个整数K(K≤10000),表示线段的个数,如果K=0表示输入结束。以后的K行,每行为一个线段的左右端点x1,x2,(0 ≤ x1 < x2 ≤ 1,000,000,000)。 输出每行输出一个样例的结果。 样例输入2 1 2 2 3 3 1 3 0 2 5 6 0 样例输出2 4 |
思路:把每个区间用结构体表示,然后把区间的左端进行从小到大排序,接着分析每俩个区间的关系,相交,包含,相离,包含的话对于总长没影响,相离则把他直接加上,相交,则是看之前的加上后面的减去相交的。
#include<stdio.h>
#include<stdlib.h>
struct qj{
int head;
int end;
};
struct qj a[10001];
int compare(const void* p1,const void* p2)
{
return (*(struct qj*)p1).head - (*(struct qj*)p2).head;
}
int main()
{
int k;
while(scanf("%d", &k)!=EOF&&k!=0){
for(int i=0;i<k;i++)scanf("%d %d", &a[i].head, &a[i].end);
qsort(a,k,sizeof(a[0]),compare);
int right = a[0].end;
int ans = a[0].end - a[0].head;
for(int i=1;i<k;i++){
if(a[i].head>=right&&a[i].end>right){//相离
ans = ans + a[i].end - a[i].head;
right = a[i].end;
}else if(a[i].head<right&&a[i].end>right){//相交
ans = ans + a[i].end - right;
right = a[i].end;
}//还有一个内含,无影响
}
printf("%d\n", ans);
}
return 0;
}