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