pid=4864">http://acm.hdu.edu.cn/showproblem.php?pid=4864

大致题意:有n台机器和m个任务,都有两个參数工作时间time和难度level。每一个机器一天仅仅能完毕一个任务。一个任务仅仅能被一台机器完毕。每一个任务完毕后的利润是500*time+2*level。

问在一天能完毕尽量多的任务下获得的利润是多少。



思路:由上述公式知决定利润的决定性因素是时间,对任务按时间优先从大到小排序,对每个任务先找出全部满足该任务时间的机器。然后从这些机器里选择合适且level最低的机器。也就是说机器的level从小到大排序,然后从最小的合适的level開始找合适的时间,找到一个这样合适的机器就结束。因为数目最大为100000。所以能够借助STL的set按level保存机器,查找时使用lower_bound()函数寻找下界。

#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-8
#define PI acos(-1.0)
using namespace std; struct node
{
    int time,level;
    bool operator < (const struct node &tmp)const
    {
        if(time == tmp.time)
            return level > tmp.level;
        return time > tmp.time;
    }
}task[100010];
int n,m; int cnt;
_LL ans; int main()
{
    int x,y;     while(~scanf("%d %d",&n,&m))
    {
        multiset <int> mac[110];
        int maxlevel = -1;
        for(int i = 1; i <= n; i++)
        {
            scanf("%d %d",&x,&y);
            mac[y].insert(x);
            maxlevel = max(maxlevel,y);
        }         for(int i = 1; i <= m; i++)
        {
            scanf("%d %d",&task[i].time,&task[i].level);
        }
        sort(task+1,task+1+m);
        cnt = 0;
        ans = 0;         for(int i = 1; i <= m; i++)
        {
            x = task[i].time;
            y = task[i].level;
            for(int j = y; j <= maxlevel; j++)
            {
                multiset<int>::iterator it = mac[j].lower_bound(x);
                if(it == mac[j].end() || (*it) < x)
                    continue;
                cnt++;
                ans += 500 * task[i].time + 2 * task[i].level;
                mac[j].erase(it);
                break;
            }
        }
        printf("%d %I64d\n",cnt,ans);
    }
    return 0;
}





hdu 4864 Task(贪心)的更多相关文章

  1. Hdu 4864(Task 贪心)(Java实现)

    Hdu 4864(Task 贪心) 原题链接 题意:给定n台机器和m个任务,任务和机器都有工作时间值和工作等级值,一个机器只能执行一个任务,且执行任务的条件位机器的两个值都大于等于任务的值,每完成一个 ...

  2. HDU 4864 Task(贪心)

    HDU 4864 Task 题目链接 题意:有一些机器和一些任务.都有时间和等级,机器能做任务的条件为时间等级都大于等于任务.而且一个任务仅仅能被一个机器做.如今求最大能完毕任务.而且保证金钱尽量多 ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可 ...

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

    题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于 ...

  5. hdu 4864 Task (贪心 技巧)

    题目链接 一道很有技巧的贪心题目. 题意:有n个机器,m个任务.每个机器至多能完成一个任务.对于每个机器,有一个最大运行时间xi和等级yi, 对于每个任务,也有一个运行时间xj和等级yj.只有当xi& ...

  6. HDU 4864 Task(经典贪心)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=4864 Task Time Limit: 4000/2000 MS (Java/Others)    M ...

  7. hdu 4864 Task

    题目链接:hdu 4864 其实就是个贪心,只是当初我想的有偏差,贪心的思路不对,应该是这样子的: 因为 xi 的权值更重,所以优先按照 x 来排序,而这样的排序方式决定了在满足任务(即 xi > ...

  8. hdu 4864 Task(贪婪啊)

    主题链接:pid=4864">http://acm.hdu.edu.cn/showproblem.php?pid=4864 Task Time Limit: 4000/2000 MS ...

  9. HDU 4864 Task (贪心)

    Task 题目链接: http://acm.hust.edu.cn/vjudge/contest/121336#problem/B Description Today the company has ...

随机推荐

  1. h5开发app,移动端 click 事件响应缓慢的解决方案

    造成点击缓慢的原因 从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约 300 毫秒的等待时间.为什么这么设计呢? 因为它想看看你是不是要进行双击(double tap)操作. 使用 ...

  2. WebDriver的多浏览器测试的浏览器驱动程序

    1.在使用IE浏览器进行WebDriver自动化测试之前,需要从http://docs.seleniumhq.org/download/网站上下载一个WebDriver链接IE浏览器的驱动程序,文件名 ...

  3. 懒癌晚期学图论的时候自己用C语言写了个求可达性矩阵的算法~

    可达性矩阵算法~ 直接上代码 #include <iostream> #include <cstring> using namespace std; #define n 5 v ...

  4. 在CentOS6.4上安装GitLab

    1.Install and configure the necessary dependencies On CentOS 6 (and RedHat/Oracle/Scientific Linux 6 ...

  5. Format 格式化函数

    转自:老百姓 Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用: 首先看它的声明:function Format(const ...

  6. Buffer.from()

    Buffer.from(array) array {Array} 使用一个8位字节的数组分配一个新的 Buffer. const buf = Buffer.from([0x62, 0x75, 0x66 ...

  7. linux下硬盘分区、格式化以及文件管理系统

    1.添加虚拟硬盘 (1)点击编辑虚拟机位置,然后点击添加   (2)点击添加硬盘 (3)点击下一步 (4)创建新虚拟磁盘并点击下一步 (5)指定磁盘容量并且点击下一步 (6)点击完成 2.系统分区 当 ...

  8. Oracle创建 表空间 用户 给用户授权命令

    //创建表空间 create tablespace ACHARTSdatafile 'D:\oradata\orcl\ACHARTS01.DBF' size 800mautoextend on nex ...

  9. UI组件之色彩选择器

    var myData = { canvas : document.getElementById('colors'),// context : myData.canvas.getContext('2d' ...

  10. 将 Oracle VirtualBox 中运行的虚拟机导入 VMware Fusion、Workstation 或 Player

    1.从virtualbox种导出电脑为 .ova格式镜像 要导入 Oracle VirtualBox 中运行的虚拟机,必须将该虚拟机从 VirtualBox 导出到开放虚拟化格式存档(.ova 文件) ...