HDU 4864(多校)1004 Task

Problem Description

Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task has a difficulty level yi. The machine whose level below this task’s level yi cannot complete this task. If the company completes this task, they will
get (500*xi+2*yi) dollars.

The company has n machines. Each machine has a maximum working time and a level. If the time for the task is more than the maximum working time of the machine, the machine can not complete this task. Each machine can only complete a task one day. Each task
can only be completed by one machine.

The company hopes to maximize the number of the tasks which they can complete today. If there are multiple solutions, they hopes to make the money maximum.

Input

The input contains several test cases.

The first line contains two integers N and M. N is the number of the machines.M is the number of tasks(1 < =N <= 100000,1<=M<=100000).

The following N lines each contains two integers xi(0<xi<1440),yi(0=<yi<=100).xi is the maximum time the machine can work.yi is the level of the machine.

The following M lines each contains two integers xi(0<xi<1440),yi(0=<yi<=100).xi is the time we need to complete the task.yi is the level of the task.

Output

For each test case, output two integers, the maximum number of the tasks which the company can complete today and the money they will get.

Sample Input

1 2
100 3
100 2
100 1

Sample Output

1 50004

Source

2014 Multi-University Training Contest
1

我的渣代码就是过不了,看了大神 点击打开链接 的,开始觉得有BUG,后来想了想

这种方法真好,值得我去学习=-=

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int n,m;
int h[maxn];
struct node{
    int x,y;
}e[maxn],f[maxn];
int cmp(node l1,node l2)
{
     if(l1.x==l2.x)
         return l1.y>l2.y;
     return l1.x>l2.x;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        memset(h,0,sizeof(h));
        for(int i=0;i<n;i++)
            scanf("%d%d",&e[i].x,&e[i].y);
        for(int i=0;i<m;i++)
            scanf("%d%d",&f[i].x,&f[i].y);
        sort(e,e+n,cmp);
        sort(f,f+m,cmp);
        int num=0,j=0;
        long long ans=0;
        for(int i=0;i<m;i++)
        {
            while(j<n&&e[j].x>=f[i].x)//由于对e,f,都排了序所以找出大于f[i].x所有的e[j],将e[j].y储存起来;
            {
                h[e[j].y]++;
                j++;
            }
            for(int k=f[i].y;k<=100;k++)//从找到的e[j].y中选择最小的
            {
                if(h[k])//判断是否存在
                {
                    h[k]--;
                    num++;
                    ans+=f[i].x*500+f[i].y*2;
                    break;
                }
            }
        }
        printf("%d %I64d\n",num,ans);
    }
    return 0;
}

HDU 4864(多校)1004 Task,布布扣,bubuko.com

时间: 2024-11-03 05:33:48

HDU 4864(多校)1004 Task的相关文章

HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可以工作的最长时间和一个可以完成的任务的难度的最大值, 一台机器能完成一个任务的条件是这台机器的最长工作时间和能完成任务的难度值必须都大于等于这个任务,而且一台机器最多完成一个任务,假设一个任务的时间为t,难度值为x,那么完成这个任务可以赚到的钱 money = 500 * t + 2 * x; 现在

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

Task 比赛当时思路想的差不多,感觉能过的,该处理的也都处理到了,最后还是没过,可能是二分写错了吧-.- 大意:给你n个机器,m个要完成的任务,每个机器跟任务都有两个属性,机器是最大工作时间跟等级,任务是需要工作的时间跟等级.完成一个任务可以得到500*(工作时间)+2*(等级)的报酬.完成任务的条件是机器的工作时间满足任务的需要,等级要大于等于任务的等级,一个机器只能用一次,一个任务也只能用一个机器去完成.需要进行策略选择,使得完成更多的任务. 思路:开始想的就是贪心,也想到了贪心的时候时间

2014多校第一场D题 || HDU 4864 Task (贪心)

题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于任务的等级.一台机器只能完成一个任务,一个任务只能被一台机器完成.每个机器完成一个任务公司能够获得500*xi+2*yi (此处xy都是指被完成的任务的).输出所有机器能完成的最多任务数,和最大盈利. 思路 :贪心,自己做的时候想了各种排序都不对,没有考虑到500*xi+2*yi 这个公式的重要性.

HDU 4864 Task(贪心)

HDU 4864 Task 题目链接 题意:有一些机器和一些任务,都有时间和等级,机器能做任务的条件为时间等级都大于等于任务,并且一个任务只能被一个机器做,现在求最大能完成任务,并且保证金钱尽量多 思路:贪心,对于每个任务,时间大的优先去匹配,时间相同的,等级大的优先去匹配,因为时间占得多,时间多1就多500,而等级最多才差200.然后匹配的时候,尽量使用等级小的去匹配,而时间只要大于它的都可以用,因为是按时间优先,所以如果该时间能匹配大的,其他肯定也能匹配,那么肯定优先匹配大的,所以只要在等级

hdu 4864 Task (贪心)

# include <stdio.h> # include <algorithm> # include <string.h> using namespace std; struct node { int t; int v; int yy; }; struct node a[100010],b[100010]; bool cmp(node a1,node a2) { if(a1.t==a2.t)//先按时间从大到小 return a1.v>a2.v;//再按水平从大

hdu 4864 Task (贪心 技巧)

题目链接 一道很有技巧的贪心题目. 题意:有n个机器,m个任务.每个机器至多能完成一个任务.对于每个机器,有一个最大运行时间xi和等级yi, 对于每个任务,也有一个运行时间xj和等级yj.只有当xi>=xj且yi>=yj的时候,机器i才能完成任务j,并获得 500*xj+2*yj金钱.问最多能完成几个任务,当出现多种情况时,输出获得金钱最多的情况. 分析:机器和任务都按照先拍x从大到小,再拍y从大到小的顺序.然后遍历任务,注意f[]数组的作用,f[]数组标 记大于当前任务时间的机器的等级个数,

HDU 4864 Task(基本算法-贪心)

Task Problem Description Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task has a difficulty level yi. The machine whose level below this task's level yi cannot complete this task. If the company

hdu 4864(2) 线段树

对task和machine的yi由小到大进行排序,然后对machine来跟task配对.当machine[].yi >= task[].yi时,就更新线段树,在1-1440上做线段树,线段树存的是task[].xi,同时用用优先队列保存task[].yi:当machine[].yi < task[].yi时,就查找 1到machine[].xi最大的值.如果存在最大值的话,把优先队列里的task[].yi取出来..这样一个machine就匹配到了一个最优的任务.还是看代码好好意会吧,细节挺多的

hdu 4864 2014STD D题

1.要能够分析出贪心的理由 2.在lv里面进行lower_bound : 因为对于task的time本来就已经是从大到小排好序的,对于task里的每个time我们应该从最小的level开始放, 因为可能在task后面有比较大的lv; 3.lower_bound的用法 4.二分的写法 5.比较函数cmp #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #