目录
牛客__NC147主持人调度(二)_贪心
主持人调度(二)_牛客题霸_牛客网 (nowcoder.com)
描述:
有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。
一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。
题目解析
左端点排序,然后搞个堆:
1. 先把第一个区间的右端点加入到堆中。
2. 遍历后面的区间,分情况讨论:
- 如果左端点大于等于堆顶元素,能接在后面,干掉堆顶,然后把这个区间的右端点加入堆;
- 否则的话,只能再来一个人,只把这个区间的右端点加入堆。
3. 最后堆的大小就是需要的人数。
C++代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算成功举办活动需要多少名主持人
* @param n int整型 有n个活动
* @param startEnd int整型vector<vector<>> startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
* @return int整型
*/
int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
sort(startEnd.begin(), startEnd.end());
priority_queue<int, vector<int>, greater<int>> res; // 存储每个主持人的结束时间
res.push(INT_MIN); // 法二,用堆优化,注意一开始push INT_MIN!!!!!!不能是0
for(int i = 0; i < n; ++i)
{
if(res.top() <= startEnd[i][0])
{
res.pop();
res.push(startEnd[i][1]);
}
else
{
res.push(startEnd[i][1]);
}
}
return res.size();
}
};
/*
int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
sort(startEnd.begin(), startEnd.end());
vector<int> res; // 存储每个主持人的结束时间
res.push_back(INT_MIN); // 法一,注意一开始push_back INT_MIN,不能是0
for(int i = 0; i < n; ++i)
{
// if(startEnd[i][0] < startEnd[i - 1][i])
// ++res;
bool flag = false;
for(auto& e : res) // 找一个主持人去主持
{
if(e <= startEnd[i][0])
{
e = startEnd[i][1];
flag = true;
break;
}
}
if(flag == false)
{
res.push_back(startEnd[i][1]);
}
}
return res.size();
}
};
*/
Java代码
import java.util.*;
public class Solution
{
public int minmumNumberOfHost (int n, int[][] startEnd)
{
Arrays.sort(startEnd, (a, b) -> {
//return a[0] <= b[0] ? -1 : 1;
return a[0] - b[0];
});
PriorityQueue<Integer> heap = new PriorityQueue<>(); // ⼩根堆
heap.offer(startEnd[0][1]);
for(int i = 1; i < n; i++)
{
int a = startEnd[i][0], b = startEnd[i][1];
if(a >= heap.peek()) // ⽆重叠
{
heap.poll();
heap.offer(b);
}
else // 有重叠
{
heap.offer(b);
}
}
return heap.size();
}
}