1.9 高效率的安排见面会

本文介绍了一种利用贪心算法解决面试调度问题的方法,旨在找出进行N个面试所需的最少面试点数量。提供了两种实现思路及对应的伪代码,一种通过颜色标记避免冲突,另一种则通过维护颜色使用数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

一天中,要进行N个面试,它们的时间分别为[B[i], E[i]],分别表示面试的开始时间跟面试的结束时间。这N个面试安排在若干个面试点进行,不同的面试在同一个时间不能被安排在同一个面试点。

现在要求出至少需要多少个面试点。


分析思路:

通过贪心算法来解决,算法的思路是:对于所有的面试I[i] = [B[i], E[i]],按B[i]从小到大排序,然后按顺序对各个区间着色。

对当前区间i着色时,必须保证所着的颜色(color[i])没有被出现在这个区域之前且时间段与当前区间有重叠的区间用到。

假设面试的总数为N,那么代码如下:

int nMaxColor = 0, k = 0;
bool isForbidden[NMAX];
for(int i = 0; i < n; ++i) {
	for(k = 0; k < nMaxColor; ++k) isForbidden[k] = false;
	for(int j  = 0; j < i; ++j) if(Overlap(b[j], e[j], b[i], e[i])) isForbidden[color[j]] = true;
	for(k = 0; k < nMaxColor; ++k) if(!isForbidden[k]) break;
	if(k < nMaxColor) color[i] = k;
	else color[i] = nMaxColor++;
}

上述代码中nMaxColor就是最后返回的所需的最少颜色。

isForbidden是对于每个时间区间i,其他时间区间j中开始时间位于这个时间区间之前的且与这个时间区间有重叠的面试所占用的颜色的标识数组。

Overlap函数,则是用来判断两个时间区间是否有重叠。



还有一种更简单的思路:

我们要得到的是最少所需的颜色数

仍然先对面试数组排序, 然后遍历面试数组, 每遇到一个 B, color +1, 并维护全局最大 color 数; 每遇到一个 E, color 数减一. 返回全局最大 color 值

代码如下:

int nColorUsing = 0, nMaxColor = 0;
for(int i = 0; i < 2 * n; ++i) {
	if(TimePoints[i].type == "Begin") {
		nColorUsing++;
		if(nColorUsing > nMaxColor) nMaxColor = nColorUsing;
	}else nColorUsing--;
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值