hihocoder155周 任務分配
阿新 • • 發佈:2017-06-24
不難 tdi 切換 trick get art 題目 int pre
時間限制: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 }
-
參考博文http://blog.csdn.net/qq508618087/article/details/51536947
hihocoder155周 任務分配