码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4864 Task(2014多校--贪心)

时间:2014-07-23 22:40:27      阅读:445      评论:0      收藏:0      [点我收藏+]

标签:style   http   2014   for   re   c   

Task


比赛当时思路想的差不多,感觉能过的,该处理的也都处理到了,最后还是没过,可能是二分写错了吧-。-

大意:给你n个机器,m个要完成的任务,每个机器跟任务都有两个属性,机器是最大工作时间跟等级,任务是需要工作的时间跟等级。完成一个任务可以得到500*(工作时间)+2*(等级)的报酬。完成任务的条件是机器的工作时间满足任务的需要,等级要大于等于任务的等级,一个机器只能用一次,一个任务也只能用一个机器去完成。需要进行策略选择,使得完成更多的任务。

思路:开始想的就是贪心,也想到了贪心的时候时间是主导因素,要优先考虑,赛后写的时候是看的标程用的map来实现的。

struct node
{
    int time, lev;
} a[100010], b[100010];

int cmp(node a, node b)
{
    if(a.time == b.time)
        return a.lev > b.lev;
    return a.time > b.time;
}

map<int, int> M;
int n, m;

int main()
{
    while(~scanf("%d%d", &n, &m))
    {
        for(int i = 0; i < n; ++i)
        {
            scanf("%d%d", &a[i].time, &a[i].lev);
        }
        for(int i = 0; i < m; ++i)
        {
            scanf("%d%d", &b[i].time, &b[i].lev);
        }
        sort(a, a+n, cmp);
        sort(b, b+m, cmp);
        M.clear();
        int j = 0;
        int ans1 = 0;
        long long ans2 = 0;
        for(int i = 0; i < m; ++i)
        {
            while(j < n && a[j].time >= b[i].time)
            {
                M[a[j].lev]++;
                ++j;
            }
            map<int, int>::iterator it = M.lower_bound(b[i].lev);
            if(it != M.end())
            {
               ans1++;
               ans2 += 500*b[i].time+2*b[i].lev;
               int t = it->first;
               M[t]--;
               if(M[t] == 0)
               {
                   M.erase(t);
               }
            }
        }
        printf("%d %I64d\n", ans1, ans2);
    }

    return 0;
}


HDU 4864 Task(2014多校--贪心),布布扣,bubuko.com

HDU 4864 Task(2014多校--贪心)

标签:style   http   2014   for   re   c   

原文地址:http://blog.csdn.net/xuechelingxiao/article/details/38070619

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!