USACO擠牛奶(區間合併)
阿新 • • 發佈:2021-01-18
技術標籤: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≤10的6次方
輸入樣例:
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;
}