• hihocoder155周 任务分配


    时间限制: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
     
  • 相关阅读:
    Java日历表
    递归实现文件的大小计算
    将机器学习的个性化推荐与社会化机制相结合
    设计模式——抽象工厂模式
    从mysql到nosql
    设计模式——Adapter模式(变压器)
    Java 正则匹配
    对象集合转换为datatable
    sql1
    Oracle Index 相關知識
  • 原文地址:https://www.cnblogs.com/weedboy/p/7071894.html
Copyright © 2020-2023  润新知