列表

详情


NC22893. 挤牛奶

描述

三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300时刻(从5点开始计时,秒为单位)给他的牛挤奶,一直到1000时刻。第二个农民在700时刻开始,在 1200时刻结束。第三个农民在1500时刻开始2100时刻结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300时刻到1200时刻),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200时刻到1500时刻)。

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

    (1)    最长至少有一人在挤奶的时间段。
    (2)    最长的无人挤奶的时间段。

输入描述

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)

上一题