题目来源:主持人调度(二)_牛客题霸_牛客网
我们从贪心算法上面开始理解
首先,一天有n个活动,为了最少消耗主持人,是不是我们应该希望这些活动很听话,从早到晚一个接一个比如说【1,3】到【4,5】再到【8,16】等等
那我们就开始有思路了
当一个主持人从早到晚最多主持多少个节目,剩下的交给其他主持人。每个主持人抱着这种调度,那么应该就可以花费最少主持人。
问题1:怎么得到一个主持人最多主持的节目呢
让我们想想,当1号主持人主持最多节目,是不是得这些节目乖乖听话,把区间最合适,并且区间数量最多的给主持人1号
通过数学归纳法我们得知,
我们的贪心策略应该是每次选取结束时间最早的活动。直观上也很好理解,按这种方法选择相容活动为未安排活动留下尽可能多的时间。这也是把各项活动按照结束时间单调递增排序的原因。
所以我们先对这些开始时间和结束时间先排个序
接下来看看,怎么样会增加主持人呢
当从1点到4点,第二个活动3点到6点是不是就会增加主持人的个数
那我们就开始比较
这样就能得到主持人的个数了
完整代码
class Solution {
public:
int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
vector<int> start;
vector<int> end;
//分别得到活动起始时间
for(int i = 0; i < n; i++){
start.push_back(startEnd[i][0]);
end.push_back(startEnd[i][1]);
}
//分别对开始和结束时间排序
sort(start.begin(), start.end());
sort(end.begin(), end.end());
int res = 0;
int j = 0;
for(int i = 0; i < n; i++){
//新开始的节目大于上一轮结束的时间,主持人不变
if(start[i] >= end[j])
j++;
else
//主持人增加
res++;
}
return res;
}
};