如:
(2,8) (1,5) ,则长度为8-1+1=9。
(3,6) (3,4) ,侧长度为6-3+1=4。
这样,求出所有的n条线的总长度。输入:
n,以后有n个输入每一个为a,b (b>=a) 但是不保证两次输入间的位置关系。
输出:
线段总长度。
我的思路:
首先考虑两个线段的情况,发现可能分离,或者合并,但是还有可能有新的线段在这两个线段之间使得原本分离的两条线段合并。因此需要确定可能合并的线段要先给线段按
起点排序,然后从前向后处理,这时分离的线段不能合并,而且合并线段只能和已处理的末尾点在最后的线段进行合并,然后替换最后的线段。重复直到所有线段处理完毕。
排序好的线段有三种情况;
(1)新的线段与最后线段分开,对于总长增加度则为新的线段长度,并且新的线段为最后的线段。
(2)新的线段被最后线段包含,对于总长增加度则为新的线段长度。
(3)新的线段起点被最后线段包含,终点超出原末尾点,对于总长增加度则为新的线段末尾-原线段末尾点。
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1000;
int s=-1,e=-1,total=0;
struct line{
int s,e;
};
bool cmp(line l1, line l2){
return l1.s < l2.s;
}
int main(){
int m,n,i;
line lines[maxn];
s=0,e=0;
cin >> n;
for(i=0;i<n;i++){
cin >> lines[i].s >> lines[i].e;
}
sort(lines,lines+n,cmp);
if(n>0){
s=lines[0].s;
e=lines[0].e;
}
for(i=1;i<n;i++){
if(lines[i].s <= e){//需要合并最后一条线
if(lines[i].e > e){
e = lines[i].e;
total += (lines[i].e - e);
}
}else{//需要替换最后的线
total += (lines[i].e - lines[i].s);
s = lines[i].s;
e = lines[i].e;
}
}
cout << total << endl;
return 0;
}