51Nod:活动安排问题——c语言版

有若干个活动,第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;
}

可以留言一起交流哟

点赞