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;
}

猜你喜欢

转载自blog.csdn.net/qq_43738331/article/details/112760713
今日推荐