刷题——hdu 6180 Schedule

来源:互联网 发布:js获取自定义属性 编辑:程序博客网 时间:2024/06/06 15:01
/*
!!!!!这真心想不到还能这么写:
http://blog.csdn.net/jaihk662/article/details/77489061


对于开始时间和终止时间,看成两个点,每个点用1(开始时间),-1(终止时间)标记
先按点的大小排序,大小相同的按标记大小排序(终止时间在开始时间前面)


本题除了要求最少机器外还要求最少机器下每个机器运行时间的总和,用两个数组记录每个机器的开始时间和结尾时间
int sum=0,ans=0;//sum记录每次加入点后的机器数,ans为当前最大机器数
for(int i=0;i<m;i++){
    sum+=e[i].flage;
    if(sum>ans){//若sum>ans需要加入了一个新机器,ans更新,同时更新这个机器的开始时间
        ans=sum;
        l[sum]=e[i].x;
    }
}
结束时间的更新也一样,和就是res=sum(r[1...m]-l[1...m]);
*/
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define ll long long
#define MAXN 100100
struct node{ll x;int flage;};
bool cmp(node a,node b){
    return a.x<b.x||a.x==b.x&&a.flage<b.flage;
}
node e[2*MAXN];
ll l[MAXN],r[MAXN];
int n,m;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        ll s,d;
        m=0;
        for(int i=1;i<=n;i++){
            scanf("%I64d %I64d",&s,&d);
            e[m].x=s,e[m++].flage=1;
            e[m].x=d,e[m++].flage=-1;
        }
        sort(e,e+m,cmp);
        int sum=0,ans=0;
        for(int i=0;i<m;i++){
            sum+=e[i].flage;
            if(sum>ans){
                ans=sum;
                l[sum]=e[i].x;
            }
        }
        sum=0,ans=0;
        for(int i=m-1;i>0;i--){
            sum-=e[i].flage;
            if(sum>ans){
                ans=sum;
                r[sum]=e[i].x;
            }
        }
        ll res=0;
        for(int i=1;i<=ans;i++){
            res+=r[i]-l[i];
        }
        printf("%d %I64d\n",ans,res);
    }
    return 0;
}
原创粉丝点击