時間限制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;
}