用c语言写下面题目并给出详细注释 有一个演讲大厅需要我们管理,演讲者们事先定好了需要演讲的起始时间和中止时间。 我们想让演讲大厅得到最大可能的使用。我们要接受一些预定而拒绝其他的预定,目标是使 演讲者使用大厅的时间最长。假设在某一时刻一个演讲结束,另一个演讲就可以立即开始。 请计算演讲大厅最大可能的使用时间。 输入格式: 第一行为一个整数 N,N≤5000,表示申请的数目。 以下 n 行每行包含两个整数 p,k,1 ≤ p < k ≤ 30000,表示这个申请的起始时间和中止时间。 输出格式: 一个整数,表示大厅最大可能的使用时间。 输入样例1: 5 0 3 2 6 5 7 1 5 5 9 输出样例1: 8
时间: 2024-03-08 22:49:58 浏览: 54
以下是用 C 语言实现的代码,包含详细注释:
```c
#include <stdio.h>
#include <stdlib.h>
// 演讲申请结构体,包含演讲的起始时间和中止时间
struct speech {
int start_time;
int end_time;
};
// 比较函数,用于排序
int cmp(const void *a, const void *b) {
return (*(struct speech*)a).end_time - (*(struct speech*)b).end_time;
}
int main() {
int n;
scanf("%d", &n);
// 动态申请演讲申请数组
struct speech *arr = (struct speech*)malloc(n * sizeof(struct speech));
// 读入演讲申请
for (int i = 0; i < n; i++) {
scanf("%d%d", &arr[i].start_time, &arr[i].end_time);
}
// 按照中止时间从小到大排序
qsort(arr, n, sizeof(struct speech), cmp);
int end_time = 0; // 记录当前演讲结束的时间
int max_time = 0; // 记录大厅最大可能的使用时间
// 遍历演讲申请
for (int i = 0; i < n; i++) {
if (arr[i].start_time >= end_time) { // 当前演讲可以使用大厅
max_time += arr[i].end_time - arr[i].start_time; // 更新大厅最大使用时间
end_time = arr[i].end_time; // 更新当前演讲结束的时间
}
}
printf("%d\n", max_time); // 输出大厅最大可能的使用时间
free(arr); // 释放内存
return 0;
}
```
该算法的时间复杂度为 $O(n\log n)$,其中 $n$ 为演讲申请的数量,这是由于需要对演讲申请按照中止时间从小到大排序。算法的空间复杂度为 $O(n)$,其中 $n$ 为演讲申请的数量,这是由于需要动态申请数组存储演讲申请。
阅读全文