1. 程式人生 > >【51nod-1091】線段的重疊(貪心)

【51nod-1091】線段的重疊(貪心)

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】線段的重疊(貪心)