线段长度

1.一维空间之中(L),存在若干条线,表示为(l,r)[r>=l],指从l到r的线,这条线长度为r-l,给定n条这样的线,他们之间如果相交,那么长度就是最后的表现形式,

如:

(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;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值