hdu6180Schedule(贪心+set)

来源:互联网 发布:心徹为知,循道而为 编辑:程序博客网 时间:2024/06/07 13:12
 题意:
给你一些时间区间,时间区间内的时间点必须要有机器工作,并且重合的区间必须要由不同的机器工作,问用最少的机器数,并且在这个最小机器数的前提下所花费的最小的时间和
思路:
贪心:按左端点升序排序,一个一个加就好。但是加机器操作这个多校时没有模拟出来,后来知道set里竟然也有upperbound。
代码:
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5+7;int n;struct node{    int l,r;}arr[maxn];bool cmp(node a,node b){    return a.l<b.l;}multiset<int> s;int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        s.clear();        for(int i = 0;i<n;i++)        {            scanf("%d%d",&arr[i].l,&arr[i].r);        }        sort(arr,arr+n,cmp);        ll ans = 0;        for(int i  = 0;i< n;i++)        {            multiset<int>::iterator it = s.upper_bound(arr[i].l);            if(it==s.begin())            {                ans+=arr[i].r-arr[i].l;                s.insert(arr[i].r);            }            else            {                it--;                ans+=arr[i].r-*it;                s.erase(it);                s.insert(arr[i].r);            }        }        printf("%d %lld\n",s.size(),ans);    }    return 0;}

原创粉丝点击