zoukankan      html  css  js  c++  java
  • 51nod 1091 线段的重叠

    基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
     收藏
     关注
    X轴上有N条线段,每条线段包括1个起点和终点。线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]。
    给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的。输出这个最长的距离。如果没有重叠,输出0。
    Input
    第1行:线段的数量N(2 <= N <= 50000)。
    第2 - N + 1行:每行2个数,线段的起点和终点。(0 <= s , e <= 10^9)
    Output
    输出最长重复区间的长度。
    Input示例
    5
    1 5
    2 4
    2 8
    3 7
    7 9
    Output示例
    4


    思路:最初思路 是用dp[i]保存前i个点线段重叠的最大部分,但是如果二维循环,O(n*n)的复杂度,明显超时,但是其实只用一维就完全可以搞定了,

    先按起点排序对所有点,然后找当前点前面的所有线段终点最靠后的那根,就跟当前线段有最大的重合,长度就是那个线段的终点减去当前线段的起点,但是有一种情况就是那个线段的终点超过了当前线段的终点,那么重合的长度就是当前线段的长度,那根线段覆盖当前长度。只要每次保存最大值就行,这样排序复杂度nlogn,一次遍历n,总复杂度是nlogn。


    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    struct node
    {
        int x,y;
    }p[50001];
    int cmp(node a,node b)
    {
        if(a.x!=b.x) return a.x<b.x;
        else return a.y<b.y;
    }
    int main()
    {
        //freopen("a.txt","r",stdin);
        int n,i,j,maxn=0;
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d%d",&p[i].x,&p[i].y);
        sort(p,p+n,cmp);
        int m=p[0].y;
        for(i=1;i<n;i++)
        {
            if(p[i].y>=m)  {  maxn=max(maxn,m-p[i].x); m=p[i].y;}
            else maxn=max(maxn,p[i].y-p[i].x);
        }
        printf("%d
    ",maxn);
        return 0;
    }
    



  • 相关阅读:
    druid的配置
    js学习(五)-全局函数和类内部函数区别
    js学习(四)- prototype原型对象
    js学习(三)-使用大括号({ })语法创建无类型对象
    js学习(一)-动态添加、修改、删除对象的属性和方法
    js学习(一)-对象和函数概念
    js关于函数和对象的概念
    js传递数组到后台
    ubantu一些资料
    fiddler的编程文章
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9387293.html
Copyright © 2011-2022 走看看