问题描述
给出n个线段以及它们的左端点和右端点。我们要求得到这些线段覆盖部分的长度。如线段[1,2]和[2,3]覆盖了数轴上1到3这个部分,所以它们覆盖的长度就是2。
输入格式
第一行一个数n表示有n条线段,之后的n行每行两个整数表示每个线段的左端点和右端点。
输出格式
一个数表示覆盖部分的长度。
样例输入
3
1 2
2 3
4 5
样例输出
3
数据规模和约定
0<n<=1000, 答案不超过32位整数。
#include<iostream>
using namespace std;
struct xd{
int l;
int r;
};
int length(xd xd1){
return xd1.r-xd1.l;
}
int max(int a,int b){
if(a>=b){return a;}
if(a<b){return b;}
}
int main(){
int n;
cin>>n;
xd xd2[1010];
xd xd3[1010];
xd temp;
int cnt=0;
int s=0;
for(int i=0;i<n;i++){
cin>>xd2[i].l>>xd2[i].r;
}
for(int j=0;j<n-1;j++){
for(int k=0;k<n-1-j;k++){
if(xd2[k].l>xd2[k+1].l){
temp=xd2[k];
xd2[k]=xd2[k+1];
xd2[k+1]=temp;
}
}
}
xd3[0]=xd2[0];
for(int k=1;k<n;k++){
if(xd2[k].l>xd3[cnt].r){
cnt=cnt+1;
xd3[cnt]=xd2[k];
}
if(xd2[k].l<=xd3[cnt].r){
xd3[cnt].r=max(xd3[cnt].r,xd2[k].r);
}
}
for(int jj=0;jj<=cnt;jj++){
s=s+length(xd3[jj]);
}
cout<<s<<endl;
return 0;
}