【51nod-1091】线段的重叠(贪心)

所有线段按起点从小到大排序,然后比较出最大的重叠部分。比如第i条线段和第j条线段进行比较找出重叠部分(j>i),当第j条线段的右端点<第i条线段的右端点,此时可以让i继续比较后面的线段;如果第j条线段的右端点>第i条线段的右端点,重叠部分并不会继续增大,所以需要让i+1条线段和后面的比较。

#include <bits/stdc++.h>
using namespace std;
const int N = 50004;
struct node
{
    int l, r;
} q[N];
bool cmp(node a, node b)
{
    if(a.l==b.l)
        return a.r<b.r;
    return a.l<b.l;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        scanf("%d%d", &q[i].l, &q[i].r);
    }
    sort(q, q+n, cmp);
    int ans = -1e9;
    for(int i=0; i<n-1; i++)
    {
        bool f = 0;
        for(int j=i+1; j<n; j++)
        {
            int a = max(q[i].l, q[j].l);
            int b = min(q[i].r, q[j].r);
            ans = max(ans, b-a);
            if(q[j].r>q[i].r) break; 
        }
    }
    printf("%d
", ans);
    return 0;
}
原文地址:https://www.cnblogs.com/lesroad/p/9235976.html