挤牛奶(c++实现)

题目


每天早上 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,表示农夫挤奶的开始时刻和结束时刻。


输出


共一行,包含两个整数,分别表示最长连续挤奶时间以及最长连续无人挤奶时间。


样例


输入样例:
3
300 1000
700 1200
1500 2100


输出样例:
900 300


代码

#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int> PII;
const int N = 5010;
PII q[N],s[N];
int n;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d%d",&q[i].first,&q[i].second);
    
    sort(q+1,q+n+1);
    int cnt = 0;
    int st = 0,ed=-1;
    for(int i=1;i<=n;i++){
        if(ed+1 > q[i].first){
            ed = max(ed,q[i].second);
        }else{
            st = max(st,q[i].first);
            ed = max(ed,q[i].second);
        }
        s[cnt++] = {st,ed};
    }
    sort(s,s+cnt);
    int res1=0,res2=0;
    
    for(int i=0;i<n;i++){
        res1 = max(res1,s[i].second-s[i].first);
    }
    for(int i=1;i<n;i++) res2 = max(res2,s[i].first-s[i-1].second);
    
    printf("%d %d",res1,res2);
    
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-08 12:28:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-08 12:28:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-08 12:28:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-08 12:28:02       20 阅读

热门阅读

  1. Oracle insert日期to_date()含时分秒

    2024-04-08 12:28:02       16 阅读
  2. opencv如何寻找图片轮廓

    2024-04-08 12:28:02       13 阅读
  3. AI技术创业机会之教育科技

    2024-04-08 12:28:02       16 阅读
  4. 1分钟带你了解代付业务|代付业务简介

    2024-04-08 12:28:02       14 阅读