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

来源:互联网 发布:sql查询成绩最高分 编辑:程序博客网 时间:2024/05/20 13:07

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

可以留言一起交流哟