本文主要是介绍蓝桥杯每日一题:挤牛奶(区间合并),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述:
每天早上 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,
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 secondusing 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;
}
这篇关于蓝桥杯每日一题:挤牛奶(区间合并)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!