用C语言生成以下代码 有n项活动申请使用同一场所,每项活动有一个开始和结束时间,如果任何两个活动不能重叠,问如何选择这些活动,使得被安排活动数量达到最多。 要求至少选择两项“贪心”策略进行比较,其中一个是最优的
时间: 2024-12-18 14:22:41 浏览: 20
在C语言中,这个问题通常可以使用贪心算法解决,例如最左覆盖(First Fit Decreasing,FFD)或最早结束时间优先(Earliest Finish Time,EFT)。这里我们展示一种基于EFT的简单解决方案,因为它保证了每次选取最早的结束时间的活动,尽可能减少重叠:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Event {
int start; // 活动开始时间
int end; // 活动结束时间
} Event;
// 比较事件结束时间,用于排序
int compareEnd(Event* a, Event* b) {
return a->end - b->end;
}
void activitySelection(Event* events, int n, Event** selected) {
// 对事件按结束时间降序排序
qsort(events, n, sizeof(Event), compareEnd);
int count = 0; // 已经选择的活动数
*selected = malloc(sizeof(Event)); // 初始化已选活动
if (*selected == NULL) {
printf("Memory allocation failed.\n");
return;
}
for (int i = 0; i < n; i++) {
// 如果当前活动不会和之前已选活动冲突,则添加
if (i == 0 || events[i].start >= selected[count]->end) {
(*selected)[count++] = events[i]; // 将活动添加到结果数组
}
}
free(selected[n-count]); // 释放不需要的内存
*selected = realloc(*selected, count * sizeof(Event)); // 调整内存大小
printf("Maximum number of non-overlapping activities: %d\n", count);
printf("Selected activities:\n", count);
for (int i = 0; i < count; i++) {
printf("Activity %d: Start=%d, End=%d\n", i+1, (*selected)[i].start, (*selected)[i].end);
}
}
int main() {
int n; // 活动总数
printf("Enter the number of activities: ");
scanf("%d", &n);
Event* events = malloc(n * sizeof(Event));
if (events == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
// 输入每个活动的开始和结束时间
for (int i = 0; i < n; i++) {
scanf("%d %d", &events[i].start, &events[i].end);
}
Event* selectedActivities = NULL;
activitySelection(events, n, &selectedActivities);
free(events); // 释放原始活动数组
return 0;
}
```
这个程序首先读入活动数量和每项活动的起止时间,然后按照结束时间对活动进行排序。接着逐个添加活动到结果集合,确保新添加的活动不会和已选活动冲突。最后,显示选出的最大非重叠活动数量以及它们的具体信息。
阅读全文