2017多校第10场 HDU 6180 Schedule 贪心,multiset

Posted Lsxxxxxxxxxxxxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017多校第10场 HDU 6180 Schedule 贪心,multiset相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6180

题意:给了一些任务的开始时间和终止时间,现在让我们安排k台及机器,让这些任务在k太机器上最小,并且使得机器的运行时间的和最小。

解法:按开始工作的时间从小到大排序后,用一个set容器维护一下,每次加入找set里面结束时间小于等于开始时间并且最近的点插入即可,然后如果没有小于开始时间的就重新开一台机器即可,这里可能有重复元素,需要multiset。

 

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
typedef long long LL;
struct node{
    int st, en;
    node(){}
    node(int st, int en):st(st),en(en){}
    bool operator < (const node &rhs) const{
        return st < rhs.st;
    }
}a[maxn];
multiset <int> s;
int main()
{
    int T,n;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        s.clear();
        for(int i=0; i<n; i++){
            scanf("%d %d", &a[i].st,&a[i].en);
        }
        sort(a,a+n);
        LL ans = 0;
        for(int i=0; i<n; i++){
            auto it = s.upper_bound(a[i].st);
            if(it == s.begin()){
                ans += a[i].en-a[i].st;
                s.insert(a[i].en);
            }
            else{
                it--;
                ans += a[i].en-*it;
                s.erase(it);
                s.insert(a[i].en);
            }
        }
        printf("%d %lld\n", s.size(), ans);
    }
    return 0;
}

 

以上是关于2017多校第10场 HDU 6180 Schedule 贪心,multiset的主要内容,如果未能解决你的问题,请参考以下文章

2017多校第10场 HDU 6181 Two Paths 次短路

2017多校第10场 HDU 6178 Monkeys 贪心,或者DP

2017多校第6场 HDU 6105 Gameia 博弈

2017多校第9场 HDU 6170 Two strings DP

2017多校第4场 HDU 6078 Wavel Sequence DP

2017多校第8场 HDU 6133 Army Formations 线段树合并