#include <stdio.h>
#include <stdlib.h>
struct worker {
int startTime;
int endTime;
int mark;
};
int main()
{
int n, n1 = 0, n2 = 0;
int i, j;
int LWT[50]={0}, LRT[50]={0}, maxLWT, maxLRT;
struct worker wk[100], fw, lw, temp; // fw/lw -> first/last worker
scanf("%d", &n);
for( i = 0; i < n; i++) {
scanf("%d%d", &wk[i].startTime, &wk[i].endTime);
wk[i].mark = 0;
}
for ( i = 0; i < n; i++) {
for ( j = i; j < n; j++) {
if ( wk[i].startTime > wk[j].startTime) {
temp = wk[i];
wk[i] = wk[j];
wk[j] = temp;
}
}
}
fw = wk[0];
lw = wk[0];
LWT[n1] = wk[0].endTime - wk[0].startTime;
i = 1;
while ( i < n ) {
if ( wk[i].endTime < lw.endTime )
i++;
else if ( wk[i].endTime > lw.endTime && wk[i].startTime <= lw.endTime ) {
LWT[n1] += (wk[i].endTime - lw.endTime);
lw = wk[i];
i++;
}
else if ( wk[i].startTime > lw.endTime ) {
LRT[n2++] = wk[i].startTime - lw.endTime;
LWT[++n1] = wk[i].endTime - wk[i].startTime;
lw = wk[i];
i++;
}
}
maxLWT = 0;
for( i = 0; i <= n1; i++ ) {
if ( LWT[i] > maxLWT )
maxLWT = LWT[i];
}
maxLRT = 0;
for( i = 0; i <= n2; i++ ) {
if ( LRT[i] > maxLRT )
maxLRT = LRT[i];
}
printf("%d %d", maxLWT, maxLRT);
return 0;
}
【问题描述】
三个工人从8点开始上班。第一个工人在300秒(从8点开始)开始干活,一直到1000秒。第二个工人在800秒开始,在1300秒结束。第三个工人在1500秒开始,在2100秒结束。期间最长的至少有一个工人在干活的连续时间LWT为1000秒(从300秒到1300秒),而最长的无人干活的连续时间LRT(从第一个工人开始一直到最后一个工人结束)为200秒(从1300秒到1500秒)。
你的任务是编一个程序,读入一个有N个工人(1 <= N <= 5000)干活的工作时间列表,计算以下两点(均以秒为单位):
最长至少有一人在工作的时间段LWT。
最长的无人工作的时间段LRT。(从有人工作开始算起)
【输入形式】
第1行:一个整数N。
第2至第N+1行:每行两个小于1000000的非负整数,表示一个工人的开始时刻与结束时刻。
【输出形式】
一行,两个整数,即题目所要求的两个答案LWT与LRT。
【样例输入】
3
300 1000
800 1300
1500 2100
【样例输出】
1000 200
============= 分析 ==============================
一般的做法就是先把每个人的起始时间排序,然后从第一个开始,如果有两个人的时间有重合的把计算LWT的时间拼上去,如果发现了断点,就要开始计算LRT时间,并且计算下一个LWT
最后,从LWT和LRT中寻找最大的
===================代码==================