描述
给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), …, ( SN, EN ), 计算最少需要多少台机器才能按时完成所有任务。
同一时间一台机器上最多进行一项任务,并且一项任务必须从头到尾保持在一台机器上进行。任务切换不需要时间。
输入
第一行一个整数 N,(1 ≤ N ≤ 100000),表示任务的数目。 以下 N 行每行两个整数 Si, Ei,(0 ≤ Si < Ei ≤ 1000000000),表示任务的起至时间。
输出
输出一个整数,表示最少的机器数目。
样例输入
5
1 10
2 7
6 9
3 4
7 10
样例输出
3
思路:定义结构体work(sTime, eTime);表示任务的起始、终止时间,找到最大终止时间,即为所有任务结束的时间。定义排序规则:按照sTime从小到大排序,sTime相同则按照eTime从小到大排序,之后遍历,如果一项任务无法添加到所有已有的任务之后,就添加一台新机器(这里用set来维护一个eTime数组,表示现有机器上的任务的结束时间数组),最后,set的大小即为所需机器的数量。
参考代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
struct work {
int sTime;
int eTime;
};
bool cmp(work w1, work w2) {
if (w1.sTime == w2.sTime) {
return w1.eTime < w2.eTime;
}
return w1.sTime < w2.sTime;
}
int main() {
using namespace std;
int n;
while (cin >> n) {
vector<work> works(n);
int endTime = 0;
for (int i = 0; i < n; i++) {
cin >> works[i].sTime >> works[i].eTime;
if (endTime < works[i].eTime) {
endTime = works[i].eTime;
}
}
sort(works.begin(), works.end(), cmp);
multiset<int> ans;
for (int i = 0; i < n; i++) {
multiset<int>::iterator itor = ans.upper_bound(works[i].sTime);
if (ans.empty()) {
ans.insert(works[i].eTime);
}
else if (itor != ans.begin()) {
ans.erase(--itor);
ans.insert(works[i].eTime);
}
else {
ans.insert(works[i].eTime);
}
}
cout << ans.size() << endl;
}
return 0;
}