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

#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中寻找最大的


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


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值