1. 程式人生 > 其它 >USACO擠牛奶(區間合併)

USACO擠牛奶(區間合併)

技術標籤:USACO(演算法競賽入門)

每天早上 5 點,三名農夫去牛場給奶牛們擠奶。

現在從 5 點開始按秒計時,第一名農夫在第 300 秒開始給牛擠奶,並在第 1000秒停止擠奶。

第二名農夫在第 700 秒開始給牛擠奶,並在第 1200 秒停止擠奶。

第三名農夫在第 1500 秒開始給牛擠奶,並在第 2100 秒停止擠奶。

從開始擠奶到擠奶完全結束,這一期間,至少存在一名農夫正在擠奶的連續時間段的長度最長為 900 秒(第 300 秒至第 1200 秒),完全沒有任何農夫在擠奶的連續時間段的長度最長為 300 秒(第 1200 秒至第 1500 秒)。

現在給你 N 名農夫擠 N 頭奶牛的工作時間表,請你求出:

至少存在一名農夫正在擠奶的連續時間段的最長長度。

沒有任何農夫在擠奶的連續時間段的最長長度。
注意:本題中給出的所有時間均為時刻(時間點),因此在本題中擠奶區間 [100,200] 和 [201,300] 中間會有長度為 1 秒的間歇時間。

輸入格式
第一行包含整數 N,表示農夫數量。

接下來 N 行,每行包含兩個非負整數 l,r,表示農夫擠奶的開始時刻和結束時刻。

輸出格式
共一行,包含兩個整數,分別表示最長連續擠奶時間以及最長連續無人擠奶時間。

資料範圍
1≤N≤5000,
1≤l≤r≤106次方
輸入樣例:
3
300 1000
700 1200
1500 2100
輸出樣例:
900 300
#include<bits/stdc++.h>
#define x first
#define
y second
using namespace std; const int N=5010; typedef pair<int, int>PII; PII s[N]; int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>s[i].x>>s[i].y; } sort(s,s+n);//按左端點從小到大排序 int l=s[0].x,r=s[0].y;//初始化第一個區間 int sum=r-l,ans=0; for(int i=
1;i<n;i++){ if(s[i].x<=r)r=max(s[i].y,r); else { sum=max(sum,r-l); ans=max(ans,s[i].x-r); l=s[i].x; r=s[i].y; } } cout<<sum<<' '<<ans<<endl; return 0; }