设有 nn 个活动的集合 E=\{1,2,..,n\}E={1,2,..,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动 ii 都有一个要求使用该资源的起始时间 s_is i 和一个结束时间 f_if i ,且 s_i<f_is i <f i 。如果选择了活动 ii ,则它在时间区间 [s_i,f_i)[s i ,f i ) 内占用资源。若区间 [s_i,f_i)[s i ,f i ) 与区间 [s_j,f_j)[s j ,f j ) 不相交,则称活动 ii 与活动 jj 是相容的。也就是说,当 f_i \leq s_jf i ≤s j 或 f_j \leq s_if j ≤s i 时,活动 ii 与活动 jj 相容。选择出由互相兼容的活动组成的最大集合。 输入格式 第一行一个整数 nn; 接下来的 nn 行,每行两个整数 s_is i 和 f_if i 。使用c语言编程
时间: 2024-02-13 08:00:34 浏览: 126
集合的操作,C语言实现的
以下是使用 C 语言编写的代码,采用贪心算法,按照结束时间从小到大对活动进行排序,依次选择结束时间最早且与前面已选择的活动相容的活动,直到所有活动都被考虑完为止。
```c
#include <stdio.h>
#include <stdlib.h>
// 活动结构体
typedef struct Activity {
int start_time; // 开始时间
int end_time; // 结束时间
} Activity;
// 比较函数,按照结束时间从小到大排序
int cmp(const void *a, const void *b) {
return ((Activity *)a)->end_time - ((Activity *)b)->end_time;
}
int main() {
int n;
scanf("%d", &n);
Activity activities[n];
for (int i = 0; i < n; i++) {
scanf("%d%d", &activities[i].start_time, &activities[i].end_time);
}
// 按照结束时间从小到大排序
qsort(activities, n, sizeof(Activity), cmp);
int count = 0; // 记录已选择的活动数
int end_time = 0; // 记录上一个已选择活动的结束时间
for (int i = 0; i < n; i++) {
if (activities[i].start_time >= end_time) { // 选择相容的活动
count++;
end_time = activities[i].end_time;
}
}
printf("%d", count);
return 0;
}
```
阅读全文