NC22893. 挤牛奶
描述
三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300时刻(从5点开始计时,秒为单位)给他的牛挤奶,一直到1000时刻。第二个农民在700时刻开始,在 1200时刻结束。第三个农民在1500时刻开始2100时刻结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300时刻到1200时刻),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200时刻到1500时刻)。
你的任务是编一个程序,读入一个有N个农民(1 <= N <= 5000)挤N头牛的工作时间列表,计算以下两点(均以秒为单位):
(1) 最长至少有一人在挤奶的时间段。输入描述
Line 1: 一个整数N。
Lines 2..N+1: 每行两个小于1000000的非负整数,表示一个农民的开始时刻与结束时刻。
输出描述
一行,两个整数,即题目所要求的两个答案。
示例1
输入:
3 300 1000 700 1200 1500 2100
输出:
900 300
Pascal(fpc 3.0.2) 解法, 执行用时: 32ms, 内存消耗: 1000K, 提交时间: 2019-08-25 10:23:51
var a:array[0..1000000]of longint; n,b,i,j,f,c,e,d,s1,s2,t1,t2:longint; begin read(n); d:=maxlongint; for i:=1 to n do begin read(b,c); for j:=b to c-1 do a[j]:=1; if b<d then d:=b; if c>e then e:=c; end; for i:=d to e-1 do begin if a[i]=1 then begin s2:=0; s1:=s1+1; if s1>t1 then t1:=s1; end else begin s1:=0; s2:=s2+1; if s2>t2 then t2:=s2; end; end; write(t1,' ',t2); end.
C++11(clang++ 3.9) 解法, 执行用时: 7ms, 内存消耗: 1124K, 提交时间: 2019-12-01 18:23:33
#include<iostream> using namespace std; int a[1000010]; int main(){ int n,d=2e9,c,e,s1=0,s2=0,t1=0,t2=0; cin>>n; for(int i=1;i<=n;i++){ int b,c; cin>>b>>c; for(int j=b;j<=c-1;j++) a[j]=1; if(b<d)d=b; if(c>e)e=c; } for(int i=d;i<e;i++) if(a[i]==1){ s2=0; s1++; if(s1>t1)t1=s1; } else{ s1=0; s2++; if(s2>t2)t2=s2; } cout<<t1<<" "<<t2<<"\n"; return 0; }
Python3 解法, 执行用时: 63ms, 内存消耗: 6812K, 提交时间: 2021-05-21 12:18:38
n = int(input()) ls = [] for i in range(n): ls.append(list(map(int, input().split()))) ls.sort() begin, end = ls[0][0], ls[0][1] t1, t2 = 0, 0 for i in range(1, n): if ls[i][0] <= end: end = max(end, ls[i][1]) else: t1 = max(t1, end - begin) t2 = max(t2, ls[i][0] - end) begin, end = ls[i][0], ls[i][1] t1 = max(t1, end - begin) print(t1, t2)