码迷,mamicode.com
首页 > 其他好文 > 详细

hihocoder155周 任务分配

时间:2017-06-23 23:46:57      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:参考   输出   push   erase   std   遍历   任务切换   stream   logs   

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定 N 项任务的起至时间( S1E1 ), ( S2E2 ), ..., ( SNEN ), 计算最少需要多少台机器才能按时完成所有任务。

同一时间一台机器上最多进行一项任务,并且一项任务必须从头到尾保持在一台机器上进行。任务切换不需要时间。

输入

第一行一个整数 N,(1 ≤ N ≤ 100000),表示任务的数目。 以下 N 行每行两个整数 SiEi,(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周 任务分配

标签:参考   输出   push   erase   std   遍历   任务切换   stream   logs   

原文地址:http://www.cnblogs.com/weedboy/p/7071894.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!