美文网首页
HDU6180——Schedule

HDU6180——Schedule

作者: xz闲语岁月 | 来源:发表于2017-08-26 12:29 被阅读0次

    Problem

    There are N schedules, the i-th schedule has start time si and end time ei (1 <= i <= N). There are some machines. Each two overlapping schedules cannot be performed in the same machine. For each machine the working time is defined as the difference between time_end and time_start , where time_end is time to turn off the machine and time_start is time to turn on the machine. We assume that the machine cannot be turned off between the time_start and the time_end.
    Print the minimum number K of the machines for performing all schedules, and when only uses K machines, print the minimum sum of all working times.

    Input

    The first line contains an integer T (1 <= T <= 100), the number of test cases. Each case begins with a line containing one integer N (0 < N <= 100000). Each of the next N lines contains two integers si and ei (0<=si<ei<=1e9)(0<=si<ei<=1e9).

    Output

    For each test case, print the minimum possible number of machines and the minimum sum of all working times.

    Sample Input

    1
    3
    1 3
    4 6
    2 5

    Sample Output

    2 8


    思路

    贪心。对任务按开始时间排序。选择结束时间小于且最接近当前任务开始时间的机器完成当前任务,如果找不到,就新开一个机器来完成当前任务。需要用到STL中的multiset。

    代码

    #include <iostream>
    #include <set>
    #include <algorithm>
    using namespace std;
    const int N=1e5+5;
    struct Node{
        int l,r;
        bool operator<(const Node &n)const{
            return l<n.l;
        }
    }a[N];
    multiset<long long>s;
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        int t,n;
        cin>>t;
        while(t--){
            cin>>n;
            for(int i=0;i<n;i++)cin>>a[i].l>>a[i].r;
            s.clear();
            sort(a,a+n);
            int tot=0;
            long long res=0;
            for(int i=0;i<n;i++){
                if(s.empty()){
                    ++tot;
                    s.insert(a[i].r);
                    res+=a[i].r-a[i].l;
                }
                else{
                    auto temp_it=s.upper_bound(a[i].l);
                    if(temp_it==s.begin()){
                        ++tot;
                        s.insert(a[i].r);
                        res+=a[i].r-a[i].l;
                    }
                    else{
                        --temp_it;
                        res+=a[i].r-*temp_it;
                        s.erase(temp_it);
                        s.insert(a[i].r);
                    }
                }
            }
            cout<<tot<<" "<<res<<endl;
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:HDU6180——Schedule

          本文链接:https://www.haomeiwen.com/subject/flmmdxtx.html