【51nod-1091】線段的重疊(貪心)
阿新 • • 發佈:2018-06-28
clu 起點 繼續 main 需要 sin name 分享圖片 DC
所有線段按起點從小到大排序,然後比較出最大的重疊部分。比如第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; }
【51nod-1091】線段的重疊(貪心)