1091 线段的重叠

先按起点排序,起点相同时终点大的在前面。排序后遍历,记录当前起点与前面最大终点之差和当前线段长度最小值,记录最优解。

为什么要这样排序?题目要求线段长度最长,就是尽可能让覆盖区域的起点很小,终点很大。可以在取最优解时先保证起点小,这样只需取当前能取到的最大终点得到解。

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
#define MAXN 1001
#define INF 0x3f3f3f3f
struct node
{
    LL beg,end;
};
bool cmp(node a,node b)
{
    return (a.beg==b.beg)?a.end>b.end:a.beg<b.beg;
}
int main()
{
    LL n,temp;
    vector<node> vv;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        node t;
        cin>>t.beg>>t.end;
        vv.push_back(t);
    }
    sort(vv.begin(),vv.end(),cmp);
    LL ans = -1,ed = vv[0].end;
    for(int i=1;i<n;i++)
    {
        ans = max(ans,min(vv[i].end,ed)-vv[i].beg);
        ed = max(ed,vv[i].end);
    }
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/joeylee97/p/6258945.html