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

    不会,看了博客才知道的,题意是叫我们求两条线段重叠的最长距离,我们先把结构体排序,按照起点从小到大的顺序,那么

    str[i-1].l<=str[i].l  是一定成立的,那么我们只要找i前面所有的线段的终点最大的那条(假设最大的终点为end),如果end<=str[i].r,

    那么重叠的长度就是end-str[i].l,  而如果end>str[i].r,那么重叠长度就是str[i]的长度(str[i].r-str[i].l),然后再用这个重叠长度去更新之前已经得出的最大重叠长度,最后得到答案。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    struct node{
        int l,r;
    }str[50005];
    int ans,n,m,k;
    bool cmp(node s1,node s2)
    {
        return s1.l<s2.l;
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        scanf("%d%d",&str[i].l,&str[i].r);
        sort(str,str+n,cmp);
        int end=str[0].r;
        int ans=0;
        for(int i=1;i<n;i++)
        {
            if(str[i].r>end)
            {
                ans=max(ans,end-str[i].l);
                end=str[i].r;
            }
            else
            {
                ans=max(ans,str[i].r-str[i].l);
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    datagrid
    SQL语句
    JavaScript事件
    DOM和BOM
    JavaScript基础知识
    css
    网络编程常识
    集合框架
    多线程常识
    面向对象常识
  • 原文地址:https://www.cnblogs.com/6262369sss/p/9107629.html
Copyright © 2011-2022 走看看