先按起点排序,起点相同时终点大的在前面。排序后遍历,记录当前起点与前面最大终点之差和当前线段长度最小值,记录最优解。
为什么要这样排序?题目要求线段长度最长,就是尽可能让覆盖区域的起点很小,终点很大。可以在取最优解时先保证起点小,这样只需取当前能取到的最大终点得到解。
#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; }