【算法】最长工作时间问题

来源:互联网 发布:怎样找网络推手 编辑:程序博客网 时间:2024/05/17 03:50

#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秒结束。期间最长的至少有一个工人在干活的连续时间LWT1000(300秒到1300),而最长的无人干活的连续时间LRT(从第一个工人开始一直到最后一个工人结束)200(1300秒到1500)

你的任务是编一个程序,读入一个有N个工人(1 <= N <= 5000)干活的工作时间列表,计算以下两点(均以秒为单位):

最长至少有一人在工作的时间段LWT

最长的无人工作的时间段LRT。(从有人工作开始算起)

【输入形式】

1:一个整数N

2至第N+1:每行两个小于1000000的非负整数,表示一个工人的开始时刻与结束时刻。

【输出形式】

一行,两个整数,即题目所要求的两个答案LWTLRT

【样例输入】

3

300 1000

800 1300

1500 2100
【样例输出】

1000 200


============= 分析 ==============================

一般的做法就是先把每个人的起始时间排序,然后从第一个开始,如果有两个人的时间有重合的把计算LWT的时间拼上去,如果发现了断点,就要开始计算LRT时间,并且计算下一个LWT

 最后,从LWT和LRT中寻找最大的


===================代码==================


0 0