[题目解析]乐乐的工作

乐乐的工作(work)

时间限制: 1000 ms 空间限制: 262144 KB

题目描述

乐乐非常喜欢现在这份工作,因为公司只要求员工把每天的工作完成,不要求固定的上班时间。假如乐乐的同事有的从300时刻(以秒为单位),一直工作到3000时刻(我们认为从300时刻工作到3000时刻所工作的时间为3000-300=2700秒,即结束的那个时刻是没有工作的);有的从700时刻开始,在5200时刻结束;有的从6500时刻开始,到8100时刻结束。那么期间最长的至少有一个人在工作的连续时间是4900秒(从300时刻到5200时刻),而最长的无人工作的连续时间为1300时刻(从5200时刻到6500时刻)。
现在乐乐想知道从最早有人开始工作的时间至最后一个人离开的时间里,公司里最长至少有一人在工作的时间段和最长的无人工作的时间段。

输入

第一行一个整数n(1<=n<=5000);
接着有n行,每行有两个用空格分开的正整数Ai和Bi(0<=Ai<Bi<=1000000)。

输出

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

样例输入

样例1

3
300 3000
700 5200
6500 8100

样例2

2
10 20
21 30

样例输出

样例1

4900 1300

样例2

10 1

【思路】

用bool数组表示在该时间内,是否有农民挤牛奶,有则=true,否则=false;
注意区间的表示!我用的是左闭右开区间,输入的start认为在该时间点为true,end为false
然后就是求最大连续的true和false了
求最大连续的true和false的枚举起点和终点
输入时把start和end的最小值和最大值存起来

【代码】

#include<bits/stdc++.h>
using namespace std;
int n,x,y,a[1000001],maxtim,now,tot,max1,max0;
int main()
{
 scanf("%d",&n);
 while(n--){
  scanf("%d%d",&x,&y);
  a[x]++;a[y]--;maxtim=max(maxtim,y);
 }
 int i=0;
 while(!a[i]) i++;
 now=a[i];i++;
 for(;i<=maxtim;i++){
  tot++;
  if(a[i]){
   if(now){
    if(!(now+a[i])) max1=max(max1,tot),tot=0;
    now+=a[i];
   }
   else max0=max(max0,tot),tot=0,now+=a[i];
  }
 }
 printf("%d %d\n",max1,max0);
}
posted @ 2022-03-25 20:11  zswangziye  阅读(129)  评论(0编辑  收藏  举报