x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,10201020和12251225的重疊部分為12201220。
給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。如果沒有重疊,輸出0。
input第1行:線段的數量n(2 <= n <= 50000)。
第2 - n + 1行:每行2個數,線段的起點和終點。(0 <= s , e <= 10^9) output輸出最長重複區間的長度。 sample input
5
1 52 4
2 83 7
7 9
sample 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)區間包含跟不包含(一起處理)
#include#include#includeusing namespace std;
struct node ss[50010];
int cmp(node x,node y)
int main()
sort(ss , ss + t , cmp );
// for (int i = 0 ; i < t ; i ++ )
node s = ss[0];
int max1 = 0;
for(int i = 1 ; i < t ; i ++ ) else if ( ss[i].a >= s.b )
} cout<(應該選定乙個參考區間)
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.分兩部分處理:區間覆蓋 區間包含跟不包含
**:
線段的重疊
x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,10201020和12251225的重疊部分為12201220。給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。如果沒有重疊,輸出0。input 第1行 線段的數量n 2 n 5000...
線段的重疊
線段的重疊 1 秒 131,072 kb 5 分 1 級題 x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,10 20 和 12 25 的重疊部分為 12 20 給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。如果沒有重疊,輸出0。...
線段的重疊
x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,10201020和12251225的重疊部分為12201220。給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。如果沒有重疊,輸出0。input第1行 線段的數量n 2 n 50000...