51Nod1091 線段的重疊(貪心法 區間相關)

2021-07-09 21:26:12 字數 1529 閱讀 2254

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示例

5

1 52 4

2 83 7

7 9

output示例

分析:

這道題對初學者看似很複雜,其實認真分析就會發現很簡單。。

(下面結合例子分析一下)(本人非常弱,大神莫見笑)

首先: 先將輸入的區間起點按公升序排序,若起點相同則按終點降序排序

比如5組區間:(1 5)(2 4)(2 8)(3 7)(7 9)

按上面所述排序: (1 5) (2 8)  (2 4) (3 7) (7 9)

這樣很直觀,為什麼要起點公升序,起點相同則按終點降序排序

起點公升序很容易理解,我們要找區間覆蓋最大長度。

起點相同則按終點降序排序    明顯(1 5) (2 8) 區間覆蓋長度大於 (1 5) (2 4)  (別忘了這可是一道貪心演算法題,從最接近最優解出發)

接下來考錄主要考慮兩個方面:1區間覆蓋 

2區間包含跟不包含(一起處理)

(應該選定乙個參考區間)

1 區間覆蓋: 直接是小區間的距離(2 8)(2 4) 直接是4-2=2;

2 區間包含跟不包含: 區間包含,就是第乙個區間終點跟第二個區間起點的差值,eg: (1 5) (2 8)  即5-2=3

因為後面的區間起始點都不比(2 8)小(起點公升序)。又因為區間包含,就是第乙個區間終點跟第二個區間起點的差值。

那麼後面的區間跟(1 5)區間覆蓋長度都沒有比(2 8)區間覆蓋長度大。。顯然的,說起來很繞。所以這時再以(1 5)作為參考區間沒有意義了。

總結一下:

1.先將輸入的區間起點按公升序排序,若起點相同則按終點降序排序

2.分兩部分處理:區間覆蓋    區間包含跟不包含

**:

#include"stdio.h"

#include"stdlib.h"

#include"algorithm"

#include"math.h"

using namespace std;

const int maxn=50005;

struct regiona[maxn];

int ans=0;

int n;

void input()

void solve()

{ sort(a,a+n,cmp);//起點公升序 若起點相同,終點降序

region m=a[0];

for(int i=1;i



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 ...