一、题目
有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。
一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。
二、思路
首先根据每个活动的开始时间对活动进行排序,然后用一个集合endtime(multiset类型)来保存已经使用的主持人的结束时间(允许重复值,自动升序排序),遍历活动数组,如果当前活动的开始时间晚于最早结束活动的主持人时间(endtime的第一个值),则不用增加主持人,将这个活动安排给最早结束活动的主持人来主持即可(将endtime的第一个值设置为当前活动的结束时间,先删除,后插入新增),如果当前活动的开始时间早于最早结束的主持人的活动(endtime的第一个值),则需要另外增加主持人,当前活动的结束时间就是新增加的主持人的主持结束时间(将当前活动的结束时间查出到endtime中,不用先删除)最后,endtime的最大值就是所需要的主持人数量。
三、代码
class Solution {
public:
int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
if(n == 0) return 0;
sort(startEnd.begin(), startEnd.end(), cmp);
int ans = 0;
multiset<int> endtime; //保存每个主持人的结束时间(自动升序)
for(int i=0; i<n; i++){
if(startEnd[i][0] >= *endtime.begin()){
endtime.erase(*endtime.begin());
}
endtime.insert(startEnd[i][1]); //将当前活动的结束时间加入集合
if(endtime.size() > ans)
ans = endtime.size();
}
return ans;
}
//每个活动按开始时间升序排序
static bool cmp(vector<int> a, vector<int> b){
return a[0] < b[0];
}
};