Task

题目链接:

http://acm.hust.edu.cn/vjudge/contest/121336#problem/B

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 (500xi+2yi) 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

##题意:

有n台机器和m个任务,每台机器有对应的工作时间和难度上限,每个任务有时间需求和难度.
每个任务的报酬由时间和难度决定(500*x+2*y).
求最多完成多少任务,任务数相同时报酬尽量多.


##题解:

一开始看题目以为是每个任务有时间\难度\金钱三个因素,不方便进行贪心操作.
仔细观察题目数据范围和所给的公式后发现:时间x增加1报酬会增加500,而难度最多增加100会提升报酬200;
所以时间才是决定报酬的要素,按照时间降序排列(时间相等时难度降序)后,任务的报酬也就有序了.

现在的问题是对于每个任务,如何选取完成这个任务的机器:
由于我们对机器和任务都排序过,那么时间上能满足当前任务的机器一定也能够满足接下来任务.

而对于若干个时间上满足当前任务的机器,应该选择难度上限尽量小(但满足当前任务)的机器; 而留下难度上限大的机器以待完成后面的需求.

算法流程:
先对机器和任务都按照上述规则排序:
依次扫描每个任务,先找到时间上满足任务要求的全部机器,并将它们的难度上限在数组中标记出来(因为难度的范围只有100,记录每个难度有多少机器能应对即可). 最后找出最小能满足任务难度要求的机器即可.
WA点:难度是从0开始的; 报酬总数要用longlong


##代码:
``` cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define eps 1e-8
#define maxn 101000
#define mod 100000007
#define inf 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;

int n, m;

typedef pair<int,int> pii;

pii machine[maxn];

pii task[maxn];

int lev_cnt[110];

int main(int argc, char const *argv[])

{

//IN;

while(scanf("%d %d", &n,&m) != EOF)
{
memset(lev_cnt, 0, sizeof(lev_cnt));
for(int i=1; i<=n; i++) {
int x,y; scanf("%d %d", &x,&y);
machine[i] = make_pair(x,y);
}
for(int i=1; i<=m; i++) {
int x,y; scanf("%d %d", &x,&y);
task[i] = make_pair(x,y);
}
sort(machine+1, machine+1+n, greater<pii>());
sort(task+1, task+1+m, greater<pii>()); int finish = 0;
LL money = 0;
for(int i=1,j=1; i<=m; i++) {
int t = task[i].first;
int lev = task[i].second;
for(; j<=n; j++) {
if(machine[j].first >= t)
lev_cnt[machine[j].second]++;
else break;
} for(int k=0; k<=100; k++) {
if(!lev_cnt[k]) continue;
if(k >= lev) {
lev_cnt[k]--;
finish++;
money += 500LL*(LL)t + 2LL*(LL)lev;
break;
}
}
} printf("%d %I64d\n", finish, money);
} 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(贪心)

    pid=4864">http://acm.hdu.edu.cn/showproblem.php?pid=4864 大致题意:有n台机器和m个任务,都有两个參数工作时间time和难度le ...

随机推荐

  1. Support Library官方教程(1)概述

    Support Library The Android Support Library package is a set of code libraries that provide backward ...

  2. ConcurrentDictionary和Dictionary

    http://stackoverflow.com/questions/6739193/is-the-concurrentdictionary-thread-safe-to-the-point-that ...

  3. [58 Argo]让argo跑起来

    接上一章,使用命令mvn jetty:run启动Argo,进入localhost的页面: 58在这里给了几种常见的访问和传值方法的示例,当点击到第三条<区分queryString和form参数& ...

  4. 函数lock_rec_get_first

    /*********************************************************************//** Gets the first explicit l ...

  5. LA 3295 (计数 容斥原理) Counting Triangles

    如果用容斥原理递推的办法,这道题确实和LA 3720 Highway很像. 看到大神们写的博客,什么乱搞啊,随便统计一下,这真的让小白很为难,于是我决定用比较严格的语言来写这篇题解. 整体思路很简单: ...

  6. JavaScript闭包示例

    在下面的例子中,为什么点击所有的段落p输出都是5,而不是alert出对应的0,1,2,3,4. <html> <head> <meta charset="utf ...

  7. SJ9012: IE6 IE7 不支持 JSON 对象

    标准参考 JSON 是一种数据交换格式,RFC 4627 对 JSON 进行了详细描述. 根据 ECMA-262(ECMAScript)第 5 版中描述,JSON 是一个包含了函数 parse 和 s ...

  8. MetadataType的使用,MVC的Model层数据验证

    MetadataType的使用,MVC的Model层数据验证 指定要与数据模型类关联的元数据类   using System.ComponentModel.DataAnnotations; //指定要 ...

  9. error C2471: 无法更新程序数据库 vc90.pdb

    error C2471: 无法更新程序数据库“d:/Work/ Project/debug/vc90.pdb” fatal error C1083: 无法打开程序数据库文件:“d:/Work/ Pro ...

  10. Gulp使用指南

    Grunt靠边,全新的建构工具来了.Gulp的code-over-configuration不只让撰写任务(tasks)更加容易,也更好阅读及维护. Glup使用node.js串流(streams)让 ...