1091 線段的重疊
基準時間限制:1 秒 空間限制:131072 kb 分值: 5
難度:1級演算法題
x軸上有n條線段,每條線段包括1個起點和終點。線段的重疊是這樣來算的,[10 20]和[12 25]的重疊部分為[12 20]。
給出n條線段的起點和終點,從中選出2條線段,這兩條線段的重疊部分是最長的。輸出這個最長的距離。如果沒有重疊,輸出0。
input
第1行:線段的數量n(2 <= n <= 50000)。output第2 - n + 1行:每行2個數,線段的起點和終點。(0 <= s , e <= 10^9)
輸出最長重複區間的長度。input示例
5output示例1 52 4
2 83 7
7 9
4題意:給出n個區間,找出其中兩個區間重合的最大長度。
解析:貪心。這題的n有點大,所以n*n的複雜度行不通。排序是必不可少的。那麼問題就來了,怎麼排序?要把所有的區間全部考慮到(保證有交集的區間都要算到),那麼就先把左邊界公升序排,如果左邊界相同就按右邊界降序。至於這裡為什麼按右邊界降序排序,保證佔到的交集最大,舉個例子,【1,6】【2,4】【2,8】,顯然【2,8】與【1,6】的交集最大。排好序後,再來看如何處理這些區間。雙重迴圈(全列舉)用不了,那麼就保護右端點,一邊判斷一邊求最大值。重合的線段長一定是兩區間的右端點最小值減去後一位元素的左端點。每次取到的左端點也要考慮,舉個例子【1,6】【1,2】【3,5】這裡,不能做完【1,6】和【1,2】後就直接把左端點移到2,這樣明明是【3,5】與【1,6】有交集,處理一下就沒有交集了,所以每次做完要維護左端點,取兩區間的做大左端點。以下是我的**
#include #include int max(int m,int n)
int min(int m,int n)
typedef struct time
t;t arr[50005];
int cmp(const void*a,const void*b)
int main()
{ int n;
//freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i=0; 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 ...