蓝桥杯每日一题:挤牛奶(区间合并)

题目描述:

每天早上 5 点,三名农夫去牛场给奶牛们挤奶。

现在从 5 点开始按秒计时,第一名农夫在第 300 秒开始给牛挤奶,并在第 1000 秒停止挤奶。

第二名农夫在第 700 秒开始给牛挤奶,并在第 1200 秒停止挤奶。

第三名农夫在第 1500 秒开始给牛挤奶,并在第 2100秒停止挤奶。

从开始挤奶到挤奶完全结束,这一期间,至少存在一名农夫正在挤奶的连续时间段的长度最长为 900秒(第 300 秒至第 1200 秒),完全没有任何农夫在挤奶的连续时间段的长度最长为 300 秒(第 1200秒至第 1500 秒)。

现在给你 N 名农夫挤 N 头奶牛的工作时间表,请你求出:

  1. 至少存在一名农夫正在挤奶的连续时间段的最长长度。
  2. 没有任何农夫在挤奶的连续时间段的最长长度。

注意:本题中给出的所有时间均为时刻(时间点),因此在本题中挤奶区间 [100,200]和 [201,300] 中间会有长度为 1 秒的间歇时间。

输入格式

第一行包含整数 N,表示农夫数量。

接下来 N 行,每行包含两个非负整数 l,r,表示农夫挤奶的开始时刻和结束时刻。

输出格式

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

数据范围

1≤N≤5000,
0≤l≤r≤10^6,

输入样例:

3
300 1000
700 1200
1500 2100
输出样例:
900 300

解题思路:

读取所有挤奶的区间,将所有从小到大区间排序,遍历所有区间,如果有相交的地方就合并两区间,若不相交则要统计最长挤奶时间:当前区间r-l,最长不挤奶时间,要更新的区间的左端点-r,

更新区间l=i.x r=i.y;最有遍历完在更新一边最长挤奶时间。

参考代码:

#include <iostream>
#include <cstring>
#include <algorithm>

#define x first
#define y second

using namespace std;
typedef pair<int, int> PII;
const int N = 5010;
PII q[N];
int n;

int main()
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>q[i].x>>q[i].y;
    
    sort(q,q+n);
    
    int l = q[0].x,r = q[0].y;
    int m1 = 0,m2 = 0;
    
    for(int i=1;i<n;i++)
    {
        if(r>=q[i].x) r = max(r,q[i].y);
        else
        {
            m1 = max(m1,r-l);
            m2 = max(m2,q[i].x - r);
            l = q[i].x,r = q[i].y;
        }
    }
    m1 = max(m1,r-l);
    
    printf("%d %d",m1,m2);
    return 0;
}

 

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cocobol0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值