思路分析:通過讀題不難發現這是一道涉及貪心演算法的題,剛開始上手做也是摸不著頭腦。首先把所有的線段按起點由小到大進行排序,比如(1,5),(2,4),(2,8),(3,7),(7,9), 然後進行比較,每次比較保留最大的末尾數字,最終結果就是 max(min(最大末尾數字,本次末尾數字)- 本次起始數字,上次的比較結果);
舉個栗子:
/*
1 5
2 4
2 8
3 7
7 9
*/// 第一次
max = 5, ans = 0;
// 第二次
max = 5, ans = 4 - 2 = 2
// ans = max(min(5, 4) - 2, 0) = 4
// 第三次
max = 8, ans = 5 - 2 = 3
// max = max(5, 8) = 8, ans = max(min(5, 8) - 2, 2) = 3
// 第四次
max = 8, ans = 7 - 3 = 4
// ans = max(min(8, 7) - 3, 3) = 4
// 第五次
max = 8, ans = 4
**如下:
#include #include using namespace std;
typedef pairp;
const int max = 50000;
p a[max];
int n;
int main()
cout << ans << endl;
return 0;
}
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 ...