【活动安排问题】设有n个活动的集合E={1,2,...n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和fi,且si<fi。如果选择了活动i,则它在半开时间区间[si,fi)内占用资源。若区间[si,fi)和[sj,fj)不相交,则称活动i和活动j是相容的。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集和。
#include <stdio.h> // 引入标准输入输出头文件
#include <stdlib.h> // 引入标准库头文件,用于调用qsort等函数
// 定义一个比较函数,用于qsort排序
int compare(const void *a, const void *b) {
const int *x = (const int *)a; // 将void指针转换为int指针
const int *y = (const int *)b; // 同上
if (x[1] < y[1]) { // 如果第一个活动的结束时间小于第二个活动的结束时间
return -1; // 返回-1,表示第一个活动排在前面
} else {
return 1; // 否则返回1,表示第二个活动排在前面
}
}
// 主函数
int main() {
int n; // 定义一个整数n,用于存储活动的数量
scanf("%d", &n); // 使用scanf从标准输入读取一个整数,存储到n中
int sf[n][2]; // 定义一个二维数组sf,用于存储活动的时间信息
for (int i = 0; i < n; i++) { // 循环n次,读取每个活动的时间信息
scanf("%d %d", &sf[i][0], &sf[i][1]); // 使用scanf读取活动的起始时间和结束时间
}
qsort(sf, n, sizeof(int) * 2, compare); // 使用qsort对数组sf进行排序,每次排序两个整数
// 打印排序后的数组,供参考
for (int i = 0; i < n; i++) {
printf("%d %d\n", sf[i][0], sf[i][1]); // 打印每个活动的起始时间和结束时间
}
int f = 0, cont = 0; // 定义两个整数f和cont,分别用于存储当前活动的结束时间和活动计数
for (int i = 0; i < n; i++) { // 循环n次,处理每个活动
if (sf[i][0] >= f) { // 如果当前活动的起始时间大于或等于f
f = sf[i][1]; // 更新f为当前活动的结束时间
cont++; // 活动计数加1
}
}
printf("%d\n", cont); // 打印活动计数
return 0; // 程序结束
}
运行结果: