貪心算法-法師康的工人

時間限制1000ms空間限制 65536K

題目描述

三個法師康的工人每天早上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

分析:先結構體排序,然後用t1來記錄當前能構成連續的最早開始時間,t2來記錄當前已經能覆蓋到的最晚時間,然後通過循環不斷更新這兩個值,每次循環都更新最大連續時間,當有斷層出現時更新最大空閒時間。

#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
    int sta,end;        //開始時間、結束時間
}a[5050];
bool cmp(node x,node y)
{
    if(x.sta==y.sta)
        return x.end<y.end;
    else
        return x.sta<y.sta;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i].sta>>a[i].end;
    sort(a,a+n,cmp);                //時間升序排序
    int suc=a[0].end-a[0].sta,gap=0,t1=a[0].sta,t2=a[0].end;  //suc爲最長至少有一個工人工作的時間 
    for(int i=0;i<n;i++)
    {
        if(a[i].sta>t2)    //出現斷層時更新t1
        {
            gap=max(gap,a[i].sta-t2);
            t1=a[i].sta;
        }
        t2=max(t2,a[i].end); //每次都更新t2
        suc=max(suc,t2-t1);  
    }
    cout<<suc<<" "<<gap;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章