【问题描述】 三个工人从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 【样例说明】通过C语言实现,写出源代码
时间: 2024-02-17 11:03:52 浏览: 137
好的,以下是C语言实现的源代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 5000
typedef struct {
int start;
int end;
} Worker;
int cmp(const void* a, const void* b) {
Worker* w1 = (Worker*)a;
Worker* w2 = (Worker*)b;
return w1->start - w2->start;
}
int main() {
int n;
Worker workers[MAX_N];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &workers[i].start, &workers[i].end);
}
qsort(workers, n, sizeof(Worker), cmp);
int lwt = 0, lrt = 0;
int cur_end = 0;
for (int i = 0; i < n; i++) {
if (workers[i].start <= cur_end) {
// 有重叠部分,更新当前结束时间cur_end
cur_end = (workers[i].end > cur_end) ? workers[i].end : cur_end;
} else {
// 有间隔,计算无人工作的时间段LRT
int interval = workers[i].start - cur_end;
if (interval > lrt) {
lrt = interval;
}
// 更新当前结束时间cur_end
cur_end = workers[i].end;
}
// 计算至少有一人在工作的时间段LWT
int duration = cur_end - workers[i].start;
if (duration > lwt) {
lwt = duration;
}
}
printf("%d %d\n", lwt, lrt);
return 0;
}
```
思路和之前提供的一致,具体实现细节见代码注释。
阅读全文