洛谷-P1204 [USACO1.2]挤牛奶Milking Cows
题目描述
三个农民每天清晨 (5) 点起床,然后去牛棚给三头牛挤奶。
第一个农民在 (300) 秒 (从 (5) 点开始计时) 给他的牛挤奶,一直到 (1000) 秒。第二个农民在 (700) 秒开始,在 (1200) 秒结束。第三个农民在 (1500) 秒开始,(2100) 秒结束。
期间最长的至少有一个农民在挤奶的连续时间为 (900) 秒 (从 (300) 秒到 (1200) 秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为 (300) 秒 (从 (1200) 秒到 (1500) 秒)。
你的任务是编一个程序,读入一个有 (n) 个农民挤 (n) 头牛的工作时间列表,计算以下两点(均以秒为单位):
最长至少有一人在挤奶的时间段。
最长的无人挤奶的时间段。(从有人挤奶开始算起)
输入格式
第一行一个正整数 (n)
接下来 (n) 行,每行两个非负整数 (l,r),表示一个农民的开始时刻与结束时刻。
输出格式
一行,两个整数,即题目所要求的两个答案。
输入输出样例
输入 #1
3
300 1000
700 1200
1500 2100
输出 #1
900 300
说明/提示
【数据范围】
对于 (100\%) 的数据,(1le n le 5000),(0 le l le r le 10^6)。
题目翻译来自NOCOW。
USACO Training Section 1.2
C++代码
#include <iostream>
#include <algorithm>
using namespace std;
struct node {
int l, r;
}t[5005];
bool cmp(node x, node y) {
return x.l < y.l;
}
int main() {
int n, start, end, ans1=0, ans2=0;
cin >> n;
for (int i=0; i<n; ++i)
cin >> t[i].l >> t[i].r;
sort(t, t+n, cmp);
start = t[0].l;
end = t[0].r;
for (int i=1; i<n; ++i)
if (t[i].l <= end)
end = max(end, t[i].r);
else {
ans1 = max(ans1, end - start);
ans2 = max(ans2, t[i].l - end);
start = t[i].l;
end = t[i].r;
}
ans1 = max(ans1, end-start);
cout << ans1 << ' ' << ans2 << endl;
return 0;
}