1. 程式人生 > >計蒜客: 法師康的工人 (貪心)

計蒜客: 法師康的工人 (貪心)

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;
}