每日一题 第七十一期 洛谷 挤牛奶

[USACO1.2] 挤牛奶Milking Cows

题目描述

三个农民每天清晨 5 5 5 点起床,然后去牛棚给三头牛挤奶。

第一个农民在 300 300 300 秒 (从 5 5 5 点开始计时) 给他的牛挤奶,一直到 1000 1000 1000 秒。第二个农民在 700 700 700 秒开始,在 1200 1200 1200 秒结束。第三个农民在 1500 1500 1500 秒开始, 2100 2100 2100 秒结束。

期间最长的至少有一个农民在挤奶的连续时间为 900 900 900 秒 (从 300 300 300 秒到 1200 1200 1200 秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为 300 300 300 秒 (从 1200 1200 1200 秒到 1500 1500 1500 秒)。


你的任务是编一个程序,读入一个有 n n n 个农民挤 n n n 头牛的工作时间列表,计算以下两点(均以秒为单位):

最长至少有一人在挤奶的时间段。

最长的无人挤奶的时间段。(从有人挤奶开始算起)

输入格式

第一行一个正整数 n n n

接下来 n n n 行,每行两个非负整数 l , r l,r l,r,表示一个农民的开始时刻与结束时刻。

输出格式

一行,两个整数,即题目所要求的两个答案。

样例 #1

样例输入 #1

3
300 1000
700 1200
1500 2100

样例输出 #1

900 300

提示

【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 5000 1\le n \le 5000 1n5000 0 ≤ l ≤ r ≤ 1 0 6 0 \le l \le r \le 10^6 0lr106

题目翻译来自NOCOW。

USACO Training Section 1.2

AC代码:

#include<map>
#include<set>
#include<stack>
#include<cmath>
#include<queue>
#include<string>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<numeric>
#include<iomanip>
#define endl '\n'
//#define x first
//#define y second
using namespace std;

typedef long long ll;
typedef pair<int, int>PII;
//const int N=3e5+10;
const int MOD=1e9 + 7;
const int INF=0X3F3F3F3F;
const int dx[]={-1,1,0,0,-1,-1,+1,+1};
const int dy[]={0,0,-1,1,-1,+1,-1,+1};
const int M = 1e6 + 10;

vector<PII>p, q;
int n;
int main()
{
	cin >> n;
	for(int i = 0; i < n; i ++)
	{
		int l, r;
		cin >> l >> r;
		p.push_back({l, r});
	}
	sort(p.begin(), p.end());
	int st = -2e9, ed = -2e9;
	for(auto s : p)
	{
		if(ed < s.first)//已经无重复区间了
		{
			if(st != -2e9) q.push_back({st, ed});
			st = s.first, ed = s.second;
		}
		else ed = max(ed, s.second);
	}
	if(st != -2e9) q.push_back({st, ed});//注意最后可能还没有用完
	int minn = -INF, maxs = -INF; 
	sort(q.begin(), q.end());
	for(int i = 0; i < q.size(); i ++)
	{
		if(i != q.size() - 1)
			minn = max(minn, q[i + 1].first - q[i].second);
		maxs = max(q[i].second - q[i].first, maxs);
	}
//	cout << q.size() << endl;
//    for(int i = 0; i < q.size(); i ++)
//	{
//		cout << q[i].first << " " << q[i].second << endl;
//	}
	if(minn != -INF)
	cout << maxs << " " << minn << endl;
	else cout << maxs << " " << 0 << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值