【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\n", ans); return 0; }