hdu 4864

题目链接:点击打开链接

//先考虑时间在考虑优先级

#include<stdio.h>
#include<string.h>
#include<map>
#include<stdlib.h>

using namespace std;

struct node
{
    int x,y;
}a[110000],b[110000];//a存机器 b存任务

int comp(const void *a,const void *b)
{
    struct node *c;
    struct node *d;
    c=(struct node *)a;
    d=(struct node *)b;
    if(c->x==d->x)
        return d->y-c->y;
        return d->x-c->x;
}
int main()
{
    map<int ,int >mapp;

    int i,n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<n;i++)
            scanf("%d %d",&a[i].x,&a[i].y);

        for(i=0;i<m;i++)
            scanf("%d %d",&b[i].x,&b[i].y);
        qsort(a,n,sizeof(a[0]),comp);//机器 任务都先按时间降序排列 再按优先级降序排列
        qsort(b,m,sizeof(b[0]),comp);

        int ans1,j;
        __int64 ans2;
        ans2=0;
        ans1=j=0;
        mapp.clear();
        for(i=0;i<m;i++)//遍历任务  
        {
            while(j<n&&a[j].x>=b[i].x)//对于每一个任务先找时间比它长的机器
            {
               mapp[a[j].y]++;//把找到的机器优先级存起来
               j++;
            }
            map<int ,int >::iterator it=mapp.lower_bound(b[i].y);//返回第一个优先级大于等于任务的机器的位置

            if(it!=mapp.end())//如果找到
            {
                ans1++;
                ans2+=b[i].x*500+b[i].y*2;

                int t=it->first;
                mapp[t]--;//优先级为t的减少一个
                if(mapp[t]==0)
                    mapp.erase(t);
            }
        }

        printf("%d %I64d\n",ans1,ans2);

    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值