用c语言写出问题描述:有n项活动申请使用同一场所,每项活动有一个开始和结束时间,如果任何两个活动不能重叠,问如何选择这些活动,使得被安排活动数量达到最多。使用策略:开始时间最早优先,数据示例如下:n项活动的活动编号,开始时间和结束时间如下表所示(可自行生成活动数据): 活动编号 1 2 3 4 5 6 7 8 9 10 开始时间s 1 3 2 5 4 5 6 8 8 2 结束时间f 4 5 6 7 9 9 10 11 12 13
时间: 2024-03-13 18:48:14 浏览: 50
活动安排问题
4星 · 用户满意度95%
有n项活动申请使用同一场所,每项活动有一个开始和结束时间,如果任何两个活动不能重叠,问如何选择这些活动,使得被安排活动数量达到最多。使用策略:开始时间最早优先,数据示例如下:n项活动的活动编号,开始时间和结束时间如下表所示(可自行生成活动数据):
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1000
// 活动结构体
struct Activity {
int id; // 活动编号
int start; // 开始时间
int end; // 结束时间
};
// 比较函数,按照开始时间升序排序
int cmp(const void *a, const void *b) {
return ((struct Activity *)a)->start - ((struct Activity *)b)->start;
}
int main() {
int n; // 活动数量
struct Activity activities[MAX_N]; // 活动数组
int ans = 0; // 记录安排的活动数量
// 输入活动数量和活动信息
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &activities[i].id, &activities[i].start, &activities[i].end);
}
// 按照开始时间升序排序
qsort(activities, n, sizeof(struct Activity), cmp);
// 贪心选择活动
int last_end = 0; // 上一个活动的结束时间
for (int i = 0; i < n; i++) {
if (activities[i].start >= last_end) {
ans++;
last_end = activities[i].end;
}
}
// 输出结果
printf("%d\n", ans);
return 0;
}
```
阅读全文