线段重叠

X轴上有N条线段,每条线段包括1个起点和终点。线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]。

给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的。输出这个最长的距离。如果没有重叠,输出0。

输入

第1行:线段的数量N(2 <= N <= 50000)。 
第2 - N + 1行:每行2个数,线段的起点和终点。(0 <= s , e <= 10^9)

输出

输出最长重复区间的长度。

样例输入

5
1 5
2 4
2 8
3 7
7 9

样例输出

4

这个代码我个人觉得已经很简洁了

#include<iostream>
#include<algorithm>
using namespace std;
struct k
{
    int s,e;
}a[50005];
int cmp(k x,k y)
{
    if(x.s==y.s)
    return x.e>y.e;
    else
    return x.s<y.s;             左端从小到大,左端相等时右端点从大到小
}
int main()
{
    int n,i,j;
    while(cin>>n)
    {
        int ans=0;
        for(i=0;i<n;i++)
        cin>>a[i].s>>a[i].e;
        sort(a,a+n,cmp);
        for(i=1;i<n;i++)
        {
            if(a[i].e>=a[i-1].e)                                        如果第二个线段的右端点大于他前边的,则挑出前者的右端点减去后者的左端点。
            {
                ans=max(ans,a[i-1].e-a[i].s);
            }
            else
            {                                                                 若不大于,则用后者的右端点减去左端点,与ans比较
                ans=max(ans,a[i].e-a[i].s);
                a[i]=a[i-1];                                          这个很重要,将较长的线段后移,只有这样,才不会漏掉最大线段差产生于不相临的线段中。
            }
        }
        cout<<ans<<endl;
    } 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41325698/article/details/81291686