HDU6180——Schedule

2017-08-26  本文已影响0人  xz闲语岁月

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;
}
上一篇下一篇

猜你喜欢

热点阅读