原题:给定n个活动的开始时间集合s[i]和结束时间集合f[i],假设只有一个房间,求一个最大集合使得这些活动在时间区间内安排的活动数最多
思路:贪心法,将f[i]排序,选择最早结束的活动,剩下的时间可供之后尽量多的活动使用。因此,先将活动按结束时间排好序,例如:
a | 1 | 2 | … | i |
---|---|---|---|---|
f[i] | 4 | 7 | … | 10 |
s[i] | 3 | 1 | … | 8 |
selector(s, f)
A = {a[1]}; //a为活动
k = 1;
for m = 2 to s.length
if s[m] >= f[k]
A = A ∪ {a[m]};
k = m;
return A;
变形:假定一组活动,需要安排一些教室,使所有活动都可以进行,求所需教室的最小值
思路:以时间t为标,维护一个空余房间变量free和正在使用的房间变量busy,最终结果保存在maxNum,把s[i]和f[i] 分别排正序,同时遍历,
每当有一个s[i] = t,free–;busy++,如果free<=0,maxNum++
每当有一个f[i] = t, free++; busy–
如果题目要求返回每个活动具体应该在哪个教室进行,把free和busy维护为数组,给每个房间标号即可