法师康的工人--计蒜客

三个法师康的工人每天早上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;
}

猜你喜欢

转载自blog.csdn.net/Lunar_Queen/article/details/80592800
今日推荐