問題
有若干個活動,第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>