1. 程式人生 > >hihocoder155周 任務分配

hihocoder155周 任務分配

不難 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周 任務分配