线段长度问题

线段长度问题

描述

在数轴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;
}

posted @ 2017-05-18 22:49  让你一生残梦  阅读(418)  评论(0编辑  收藏  举报