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

2021-08-21 08:51:24 字數 1281 閱讀 9131

題幹:

x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,[10 20]和[12 25]的重疊部分為[12 20]。

給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。如果沒有重疊,輸出0。

input

第1行:線段的數量n(2 <= n <= 50000)。

第2 - n + 1行:每行2個數,線段的起點和終點。(0 <= s , e <= 10^9)

output

輸出最長重複區間的長度。

input示例

51 5

2 42 8

3 77 9

output示例

解題報告:

區間問題,先想到排序,此題以起點為標準排序,優點:排完後只需要o(n)看右端點即可,總體複雜度o(nlogn+n)。如果不排序直接暴搜複雜度是o(n^2)。

ac**:

#include#include#includeusing namespace std;

struct node node[50000+5];//沒有逗號!!!!(格式問題要記牢啊)

bool cmp(const node & a,const node & b)

int main()

//相當於以起點開始的dp搜尋(以node[i].s為起點(或者說當前的l)的最大公共區間部分)

sort(node+1,node+n+1,cmp);

//排序的好處還有乙個就是已於看清最大公共區間的可能範圍,因為你以起點排序了所以只需要排相鄰兩者即可,而不需要每乙個都搜尋一遍n,那樣複雜度是n^2了,排序再算就是o(nlogn+n)

int l=node[1].s,r=node[1].e;

for(int i = 2; i<=n; i++)

else if(node[i].e<=r)

r=max(r,node[i].e);

} printf("%d\n",maxx);

return 0 ;

}

乙個網路版的for迴圈結構是這樣的:

for(int i=1;i=f[i].e)

sum=f[i].e-f[i].s;

maxx=max(maxx,sum);

if(e>=f[i].e)

continue;

s=f[i].s;

e=f[i].e;

}

感覺這樣寫並不好,因為此處肯本不需要s的參與,因為你排好序了啊!!

51nod 1091 線段的重疊

基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,10 20 和 12 25 的重疊部分為 12 20 給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。...

51nod1091 線段的重疊

x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,10 20 和 12 25 的重疊部分為 12 20 給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。如果沒有重疊,輸出0。input 第1行 線段的數量n 2 n 50000 第2 ...

51Nod 1091 線段的重疊

x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,10 20 和 12 25 的重疊部分為 12 20 給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。如果沒有重疊,輸出0。input 第1行 線段的數量n 2 n 50000 第2 ...