1428 活动安排问题
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?
Input
第一行一个正整数n (n <= 10000)代表活动的个数。
第二行到第(n + 1)行包含n个开始时间和结束时间。
开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Input示例
3
1 2
3 4
2 9
Output示例
2
**这一题也就是求时间段重复最多的层数,网上看了一些代码,发现代码本身还可以有很多的优化,而且一些代码进行了不必要的操作,会误导很多人。
最关键的是维持一个关于结束时间的最小堆,最终最小堆的长度就是需要教师的个数**
//也就是找重叠最多的个数
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <queue>
#include <functional>
using namespace std;
//升序排,开始时间的优先级大于结束时间的优先级
bool cmp(const pair<int, int>& p1, const pair<int, int>& p2)
{
return p1.first < p2.first;
}
int main()
{
int n = 0;
while (cin>>n)
{
vector<pair<int,int>> pairVec;
int nBeginTime = 0;
int nEndTime = 0;
for (int i = 0; i < n; i++)
{
cin >> nBeginTime >> nEndTime;
pairVec.push_back(make_pair(nBeginTime, nEndTime));
}
//对pair的排序,排序之后可以通过减枝降低时间的复杂度
sort(pairVec.begin(), pairVec.end(), cmp);
//维持一个用结束时间作为元素的最小堆
priority_queue<int, vector<int>,greater<int> > minHeap;
//初始化
minHeap.push(pairVec[0].second);
//需要的教室数,就是最终堆的元素个数
for (int i = 1; i < n;++i)
{
if (pairVec[i].first >= minHeap.top())
{
//则堆里这个元素对应的数对不可能与往后的数对有交集、
//删除
minHeap.pop();
}
minHeap.push(pairVec[i].second);
}
cout << minHeap.size() << endl;
}
return 0;
}
本文介绍了一种解决活动安排问题的有效算法,通过使用最小堆来维护活动的结束时间,从而计算出最少需要多少个教室来容纳所有不冲突的活动。该算法首先按活动开始时间进行排序,然后遍历每个活动,利用最小堆更新教室数量。
4万+

被折叠的 条评论
为什么被折叠?



