有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动?
这道题很多blog都有详解,不过就是贪婪算法基础,把所有时间段的尾端从小大进行排序,然后比较之后时间的开始时间和上一个的末尾时间,查看是否会有冲突。百度上很多都是用c++写的,不得不说很方便,因为c++封装了很多方法在Algorithm这个库中,免去了我们很多时间。所以我用c语言写了一个,仅供参考:
#include <stdio.h>
#include <string.h>
void sort (long int begin[],long int end[],int m);
void swap (long int *x,long int *y);
int main (void) {
int n,i,j,k;
int result = 1;
long int begin[10002],end[10002];
scanf("%d",&n);
memset(begin,0,sizeof(begin)); //数组赋初值
memset(end,0,sizeof(end));
for(i = 0;i < n;i++) {
scanf("%d%d",&begin[i],&end[i]);
}
sort(begin,end,n);
//比较后一个任务的开始时间和上一个任务的解释时间是否有冲突,没有冲突说明则+1,并且循环跳到那个任务上。
for(k = 0; k<n;k++) {
for(j = k+1;j<n;j++){
if(end[k]<=begin[j]){
result++;
k = j;
}
}
}
printf("%d",result);
return 0;
}
//排序,先把所有时间段结束时间按照从小到大进行排序,如果结束时间相同,则把开始时间早的放前面。然后需要调换顺序的吧开始时间一起调换。
void sort (long int begin[],long int end[],int m) {
int i,j;
for (i = 0;i<m;i++) {
for (j = i+1;j<m;j++) {
if(end[i] > end[j]) {
swap(&end[i],&end[j]);
swap(&begin[i],&begin[j]);
}else if(end[i] == end[j] &&begin[i] > begin[j]) {
swap(&end[i],&end[j]);
swap(&begin[i],&begin[j]);
}
}
}
}
//交换数组函数
void swap (long int *x,long int *y) {
long int temp;
temp = *x;
*x = *y;
*y = temp;
}
可以留言一起交流哟