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

2021-08-13 04:57:44 字數 1259 閱讀 5455

1091 線段的重疊

基準時間限制:1 秒 空間限制:131072 kb 分值: 5 

難度:1級演算法題

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

4
題解:

將所有區間按照左區間遞增(相同右區間遞減)的順序排序。

包含關係,重合區間就是被包含的區間。

交叉關係,重合區間是 a[i].ed - a[i+1].st 

注意更新區間(交叉區間更新為下乙個,包含區間更新為大的(保留即不需要更新))

#include #include #include #include #include #include #include using namespace std;

#define clr(a,b) memset(a,b,sizeof(a))

#define inf 0x3f3f3f3f

#define ll long long

struct node

a[50010];

bool cmp(node a,node b)

int main()

{ int n;

scanf("%d",&n);

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

scanf("%d%d",&a[i].st,&a[i].ed);

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

node now=a[1];

int maxx=0;

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

{ if(now.ed>=a[i].ed) //a[i]被noww包含

maxx=max(maxx,a[i].ed-a[i].st);

else if(now.ed>a[i].st&&now.ed

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