三个法师康的工人每天早上6点到工厂开始到三条产品生产线上组装桔子手机。第一个工人在200时刻开始(从6点开始计时,以秒作为单位)在生产线上开始生产,一直到1000时刻。第二个工人,在700时刻开始,在1100时刻结束。第三个工人从1500时刻工作到2100时刻。期间最长至少有一个工人在生产线上工作的连续时间为900秒(从200时刻到1100时刻),而最长的无人生产的连续时间(从生产开始到生产结束)为400时刻(1100时刻到1500时刻)。
你的任务是用一个程序衡量N个工人在N条产品线上的工作时间列表(1≤N≤5000,以秒为单位)。
·最长的至少有一个工人在工作的时间段
·最长的无人工作的时间段(从有人工作开始计)
输入第1行为一个整数N,第2-N+1行每行包括两个均小于1000000的非负整数数据,表示其中一个工人的生产开始时间与结束时间。输出为一行,用空格分隔开两个我们所求的数。
样例输入
3
200 1000
700 1100
1500 2100
样例输出
900 400
开一个大数组,把所有工作的时刻都标记出来,然后扫一遍数组维护两个最大值就好了。(看了其他的博客好像还没有这么做的QAQ),注意!!! 数组下标与时刻的对应。
ac代码如下:
#include<iostream>
using namespace std;
int vis[1000005];
int main()
{
int n;
int bb=0;
int ee=0;
int mbb=1000000005;
int mee=0;
//从1开始
cin>>n;
for(int i=0;i<n;i++)
{
cin>>bb>>ee;
for(int j=bb;j<ee;j++)
vis[j]=1;
if(bb<mbb)
mbb=bb;
if(ee>mee)
mee=ee;
}
int flag=0;
int mtt=0;//最大工作时长
int mnn=0;//最大非工作时长
int ttt=0;
int tnn=0;
int ff=0;
for(int i=mbb;i<mee;i++)
{
if(vis[i]==1)
{
ttt++;
if(flag==0)
{
flag=1;
if(tnn>mnn)
{
mnn=tnn;
}
tnn=0;
}
}
if(vis[i]==0)
{
tnn++;
ff=1;
if(flag=1)
{
flag=0;
if(ttt>mtt)
{
mtt=ttt;
}
ttt=0;
}
}
}
if(ff==0)
cout<<ttt<<" "<<'0'<<endl;
else
cout<<mtt<<" "<<mnn<<endl;
return 0;
}