活動安排問題

     

活動安排問題

   設有n個活動的集合E={1,2,3,…,n},所有的活動要求使用同一資源,而在同一時間內只有一個活動能使用這一資源,每個活動都有使用這一資源的開始時間si和結束時間fi,且si<fi。目標:要在所給的活動中,找出最大的相容的活動子集合。





     性質:每次選擇具有最早完成時間的相容活動加入集合中。


解:

活動安排問題: 
與會場安排問題類似
不是需要多個會場,而是使用一個會場,儘可能多的安排活動
則對於活動進行根據結束時間進行排序
依次找出開始時間在上一活動之後的活動,在標記數組中賦值爲 1 。
標記數組中爲 1 則能被安排活動(理解會場安排問題此題更簡單) 

#include <stdio.h>
int main()
{
	int n;
	int *start,*end,*exists;
	int i,j,k;
	printf("請輸入活動的個數:");
	scanf("%d",&n);	
	start=new int [n];
	end=new int [n];
	exists=new int [n];
	for(i=0;i<n;i++)
		exists[i]=0;
	printf("請輸入活動的開始時間:");
	for(i=0;i<n;i++)
		scanf("%d",start+i);
	printf("請輸入活動的結束時間:");
	for(i=0;i<n;i++)
		scanf("%d",end+i);
	for(i=0;i<n;i++){
		for(j=i+1;j<n;j++){
			if(end[i]>end[j]){
				k=start[i];start[i]=start[j]; start[j]=k;
				k=end[i];end[i]=end[j]; end[j]=k;
			}
		}
	}	
	j=0;
	exists[j]=1;
	for(i=1;i<n;i++){
		if(start[i]>=end[j]){
			exists[i]=1;
			j=i;
		}
	}
	printf("可以安排的活動是:\n");
	for(i=0;i<n;i++){
		if(exists[i])
			printf("%d ",i);
	}
	putchar('\n');
	return 0;
}




發佈了161 篇原創文章 · 獲贊 70 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章