活動安排問題二

問題

有若干個活動,第i個開始時間和結束時間是(S,E),活動之間不能交疊,要把活動都安排完,至少需要幾個教室?


分析

因爲要把所有活動都安排完,活動先按開始時間排序,第一個活動先開一個教室,如果下一個活動的開始時間大於等於上一個活動的結束時間,這個活動併入上一個教室,反之新開一個教室,應該比完所有的教室。


算法

先定義一個結構體,存放所有活動的時刻。定義一個數組存放每個教室上一個活動的結束時間,數組存放的個數表示教室。每次比較,發現可以併入已開的教室,更新結束時間,不然下標+1新存一個結束時間。



代碼


<span style="font-size:18px;">#include <iostream>
using namespace std;
struct Data {//定義一個結構體
	int Start;
	int End;
};

void Sort(Data Activity[], int Len) {//排序
	Data temp;
	int i, j;
	for (i = 0; i < Len; i++)
		for (j = 0; j < Len; j++) {
			if (Activity[i].Start < Activity[j].Start) {
				temp = Activity[i];
				Activity[i] = Activity[j];
				Activity[j] = temp;
			}
		}
}

int GetClass(Data Activity[], int Len) {//計算教室個數的函數
	int Class[Len], N = 0, i, j, mark = 0;
	Class[0] = Activity[0].End;//數組存放最後一個活動的結束時間
	for (i = 1; i < Len; i++) {
		mark = 0;
		for (j = 0; j <= N; j++)//遍歷查找去匹配已存在的教室
			if (Activity[i].Start > Class[j] || Activity[i].Start == Class[j]) {
				Class[j] = Activity[i].End;
				mark = 1;
				break;//發現一個可以併入該活動的教室,退出循環
			}
		if (mark == 0) {//不存在匹配的教室,新開一個教室
			N = N + 1;
			Class[N] = Activity[i].End;
		}

	}
	return N + 1;//因爲是從0開始的,方便數組
}


int main()
{
	int N;
	cin>>N;
	Data Activity[N];
	for(int i=0;i<N;i++)
		cin>>Activity[i].Start>>Activity[i].End;
    Sort(Activity,N);
	cout<<GetClass(Activity,N)<<endl;
	return 0;
}</span>






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