計蒜客: 法師康的工人 (貪心)
阿新 • • 發佈:2018-11-26
https://nanti.jisuanke.com/t/102
三個法師康的工人每天早上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
先按開始時間排序。
如果前面一個人結束的時間小於這個人的開始時間,
那麼中間這段連續時間是沒有人的。
如果前面一個人結束的時間大於這個人的開始時間,
就比較兩者結束的時間,從開始時間到兩者較晚結束的時間內都至少有一個人在。
不斷更新 “ 最長的至少有一個工人在工作的時間段 ” 和 “ 最長的無人工作的時間段 ” 直到最後一個人。
#include<stdio.h> #include<algorithm> #define N 5050 using namespace std; struct data { int x; int y; }a[N]; int cmp(struct data a,struct data b) { return a.x>b.x?0:1; } int main() { int i,n,m,ms,s,t; while(scanf("%d",&n)!=EOF) { m=0; ms=0; for(i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y); sort(a,a+n,cmp); s=a[0].x; t=a[0].y; ms=t-s; for(i=1;i<n;i++) { if(a[i].x<=t) { t=max(a[i].y,t); ms=max(ms,t-s); } else { m=max(m,a[i].x-t); s=a[i].x; t=a[i].y; } } printf("%d %d\n",ms,m); } return 0; }