线段长度问题
线段长度问题
描述
在数轴X轴上有n条线段,线段之间可以有重叠,计算所有线段覆盖X轴的总长度。
输入
输入文件第一行为测试用例个数N(1<=N<=100),每个测试用例的第一行为该用例是线段的条数n(1<=n<=10000),接下来n行每行由两个实数标识一条线段,其中第一个数为左端点,第二个数为右端点,端点取值范围(0-10000之内的实数,可以为小数),数据之间用空格隔开。
输出
对每个用例,用一行输出所计算的总长度,要求去掉小数点末尾多余的0
样例输入
2
4
2 5
12 15
6 10
4 7
3
0 5
5 10
10 15
样例输出
11
15
思路:
先排序!!! 第一种:一个一个的区间段去加起来。用一个数,去记录你加的区间的位置的末端,之后加的数,每一次都去与这个数去比较一下.
主要就是几种情况如下:
(1)记录的数比前端还要小,此时就记录的数变为区间的末端,sum加上区间的范围。
(2)记录的数,在区间的范围之中,这样记录的数到末端的长度就加起来,前端不要了。
(3)记录的数在区间的外面,这样就不需要去加上范围,跳过就可以了。
第二种:两个两个的区间段加起来。思路差不多说了同上面。只不过要多几种输入的情况,比如只输入一个区间段的范围等等。
第一种的代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
double n,m;
}a[1000];
bool cmp(node n,node m)
{
return n.n<m.n;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int m;
scanf("%d",&m);
memset(a,0,sizeof(a));
for(int i=0;i<m;i++)
scanf("%lf%lf",&a[i].n,&a[i].m);
sort(a,a+m,cmp);
double sum=0;
double sum1=0;
int i;
for(i=0;i<m;i++)
{
if(sum1<=a[i].n)
{
sum1=a[i].m;
sum+=a[i].m-a[i].n;
}
else
{
if(sum1>a[i].n && a[i].m>sum1)
{
sum+=a[i].m-sum1;
sum1=a[i].m;
}
}
}
cout<<sum<<endl;
}
return 0;
}
第二种代码如下:#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node { double n,m; }a[1000]; bool cmp(node n,node m) { return n.n<m.n; } int main() { int n; scanf("%d",&n); while(n--) { int m; scanf("%d",&m); memset(a,0,sizeof(a)); for(int i=0;i<m;i++) scanf("%lf%lf",&a[i].n,&a[i].m); sort(a,a+m,cmp); double sum=0; double sum1=0; int i; for( i=0;i<m;i++) { if(a[i].m<a[i+1].n && i+1<m) { if(a[i].n>sum1) { sum1=a[i+1].n; sum+=(a[i].m-a[i].n)+(a[i+1].m-a[i+1].n); } else { if(a[i].m>sum1) { sum+=a[i].m-sum1+a[i+1].m-a[i+1].n; sum1=a[i+1].m; } } i+=1; } else { if(a[i].m>a[i+1].n && i+1<m) { if(a[i+1].m>a[i].m && sum1<a[i].n) { sum+=a[i+1].m-a[i].n; sum1=a[i+1].m; } else { if(sum1<a[i].n){ sum+=a[i].m-a[i].n; sum1=a[i].m; } else { if(a[i].m>sum1){ sum+=a[i+1].m-sum1; sum1=a[i+1].m; } else { if(sum1<a[i+1].n){ sum+=a[i+1].m-sum1; sum1=a[i+1].m; } } } } i++; } else { if(a[i].n>a[i-1].m && i-1>0) { sum+=a[i].m-a[i-1].m; } else{ if(i-1>0) //判断是不是只是一个输入的区间端 { sum+=a[i].m-a[i].n; } else sum+=a[i].m-a[i].n; } } } } cout<<sum<<endl; } return 0; }