时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定 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
- 画个图不难发现题目其实就是求最多的重合时间次数。而怎么求这个最多的重合,还是有一些tricky的。
- 1.用pair<int,int>储存每个任务的开始时间和结束结束。
- 2.根据开始时间进行排序。(这个排序很关键)
- 3.然后依次遍历,如果pair开始的时间>=已有机器的结束时间,把这个pair中的结束时间插入到multiset中,最后set的size就是需要的机器数量。
- ac代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 #include<set> 7 using namespace std; 8 9 10 int main() 11 { 12 int n, start, end, res = 0; 13 vector<pair<int, int>> time; 14 multiset<int> st; 15 cin >> n; 16 for (int i = 0;i < n;i++) { 17 cin >> start >> end; 18 time.push_back(make_pair(start, end)); 19 } 20 21 sort(time.begin(), time.end()); 22 for (int i = 0;i < n;i++) { 23 set<int>::iterator it = st.begin(); 24 while (it != st.end()) { 25 if (time[i].first >= *it) it = st.erase(it); 26 else break; 27 } 28 st.insert(time[i].second); 29 res = max(res, (int)st.size()); 30 } 31 cout << res << endl; 32 return 0; 33 }