线段长度问题(简单题)
线段长度问题
时间限制(普通/Java):5000MS/10000MS 运行内存限制:65536KByte
描述
在数轴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
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<stdio.h> using namespace std; typedef struct{ double x; double y; }P; bool func(P a,P b) { return (a.x<b.x || (a.x==b.x&&a.y<b.y)); } int main() { int t,n,i; P *p; cin>>t; while(t--) { cin>>n; p = new P[n]; for(i=0;i<n;i++) cin>>p[i].x>>p[i].y; double ans=0.0; sort(p,p+n,func); double a=p[0].x,b=p[0].y; bool flag=false; for(i=1;i<n;i++) { if(p[i].x>=a&&p[i].x<=b&&p[i].y>b) b=p[i].y; if(p[i].x>=b) { ans+=b-a; a=p[i].x; b=p[i].y; } } cout<<ans-a+b<<endl; } return 0; }