活动安排问题二

问题

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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值