活动安排问题--贪心算法

来源:互联网 发布:mac os 重新分区 编辑:程序博客网 时间:2024/04/30 04:23


    问题描述:

    设有n个活动的集合E={1,2,.....,n},其中每个活动都要求使用同一个资源(如演讲会场),而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间Si和一个结束时间Fi,且Si<Fi。如果选择了活动i,则他在改时间区间[Si,Fi]内占用资源,若区间[Si,Fi] 和区间[Sj,Fj]不相交,则称活动i与活动j是相容的。活动安排问题是要求在所给的活动集合范围内选出最大的相容的活动子集。


   问题解析:

   查找每个活动的结束时间,每一次选择时查找具有最早结束时间的相容的活动,先把n个活动按时间的结束时间非降序排列,这样,贪心选择是取当前活动集合中结束时间最早的活动就归结为取当前活动集合中排在最前面的活动。


/*----------------------------------------------------------------------------------* FileName:ActivityMange.c* author:doodlesomething@163.com* date:10-28-2014* version:1.o* description:ActivityMange-->Greedy Algorithm-------------------------------------------------------------------------------------*/#include <stdio.h>typedef struct {int start_time;  //开始时间int end_time;    <span style="font-family:Microsoft YaHei;">//结束时间</span>}Act;/** @description:swap a elem*/void swap(Act arr[],int i,int j) {Act temp;temp = arr[i];arr[i] = arr[j];arr[j] = temp;}/** @description:sort asc according to the activity end_time */void BubbleSort(Act arr[],int n) {int i,j,flag;flag = 1;for(i = 0; i < n && flag; i++ ) {flag = 0;for(j = n - 1; j >= i; j-- ) {if(arr[j].end_time < arr[j - 1].end_time)  {swap(arr,j,j - 1);flag = 1;}}}}/** @description:return the total activities can arrange together* @more:you should mention the question is [a,b) not [a,b]*/int ActivityMange(Act Activity[],int n,int flag[]) {int count,i,j;flag[0] = 1;count = 1;j = 0;for(i = 1; i < n; i++) {if(Activity[i].start_time >= Activity[j].end_time) {flag[i] = 1;count++;j = i;}else {flag[i] = 0;}}return count;}int main() {int i,n,result;int flag[100];Act Activity[100];//inputprintf("please enter n:");scanf("%d",&n);printf("please enter the list such as start_time end_time and enter Enter:\n");for(i = 0; i < n; i++) {scanf("%d%d",&Activity[i].start_time,&Activity[i].end_time);}//handlerBubbleSort(Activity,n);result = ActivityMange(Activity,n,flag);//outputprintf("total activities:%d\n",result);printf("the activities are:");for(i = 0; i < n; i++) {if(flag[i]) printf("%d\t",i);}printf("\n");return 0;/*测试:root@~/code/Algorithm/Greedy$ ./ActivityManage please enter n:5please enter the list such as start_time end_time and enter Enter:1 2312 2825 3527 8036 50total activities:3the activities are:0    2    3    <span style="font-family:Microsoft YaHei;">*/</span> }


0 0