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;
}
原文地址:https://www.cnblogs.com/6262369sss/p/9107629.html