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

题目:一家公司有m个任务需要完成,每件任务有一个最少工作时间和一个任务难度,同时这家公司一共有n台机器,每台对应一个最大工作时间和机器的等级,用这n台机器来完成任务。每台机器每天能完成一件任务----这件任务的需要的工作时间和任务难度分别要不超过机器的最长工作时间和机器的等级,每完成一件任务,公司获得500*任务工作时间+2*任务等级的利润。给定这些任务和机器的详细情况,问最多能完成多少件任务,利润是多少?(多种情况时输出最大利润)

题解的意思就是----每完成一件任务,获得利润=500*t+2*w,这里w的范围是1-100,最大值W=200<500对于整体利润的影响很小,所以对任务和时间均按照t递减排序,t相同按照w递减排序。然后从第一件任务开始遍历,找出所有能够解决这项任务的机器,并挑出工作时间最少,并且等级最低的那台来完成这项任务,以此类推,直到所有任务都完成。

为什么要这样安排呢?任务排序之后,后边的任务的一部分是时间与当前任务时间相同,但任务等级低的,能过解决当前任务的机器比人能够完成剩下的任务;另外一部分是时间比当前任务短,任务等级比当前任务高的,假设我挑走一台等级高机器,这台机器能完成这两项任务,另外存在一台机器等级低的机器只能完成当前任务,如果我用等级高的那台来完成当前任务的话,后来的任务就不能完成了,所以我要选择等级低但是能完成当前任务的那台机器;第三种情况,时间短,任务等级低的,能够完成当前任务的那些机器必然能用来完成这些任务。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
struct node
{
int x,y;
}s1[100005],s2[100005];
int cmp(node a,node b)
{
if(a.x == b.x)
return a.y>b.y;
return a.x>b.x;
}
int main()
{
int n,m,i,j,x,k;
long long sum;
while(~scanf("%d%d",&n,&m)){
x = sum = 0;
int c[101] = {0};
for(i = 0; i<n; i++){
scanf("%d%d",&s1[i].x,&s1[i].y);
}
for(i = 0; i<m; i++){
scanf("%d%d",&s2[i].x,&s2[i].y);
}
sort(s1,s1+n,cmp);
sort(s2,s2+m,cmp);
for(i = 0,j = 0; i<m; i++){
while(j<n && s1[j].x >= s2[i].x){ //将所有时间符合的都挑出来
c[s1[j].y]++;
j++;
}
for(k = s2[i].y; k <= 100; k++){ //从符合时间的里面挑出等级最低的一台来完成任务
if(c[k]){
c[k]--;
sum += (s2[i].x*500+s2[i].y*2);
x++;
break;
}
}
}
cout<<x<<" "<<sum<<endl;
}
return 0;
}

  

HDU4864:Task(贪心)的更多相关文章

  1. [HDU4864]Task (贪心)

    此图和上一篇博客的图一起看有奇效 题意 https://vjudge.net/problem/HDU-4864 思路 贪心 代码 by lyd 我实在是敲不来 #include <iostrea ...

  2. hdu4864 Task贪心好题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4864 题目大意: 有n个机器,m个任务.每个机器至多能完成一个任务.对于每个机器,有一个最大运行时间 ...

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

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

  4. hdu4864 hdu4268 贪心 lower_bound

    hdu4864 题意: 有n个机器,m个任务,n,m<=100000,每个机器都有工作时间的最大限制xi(0<xi<1440)和完成的最大难度yi(0<=yi<=100) ...

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

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

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

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

  7. HDU4864 Task(算竞进阶习题)

    贪心 比较巧妙的贪心..先把所有机器和任务按时间是第一关键字,等级为第二关键字排序. 然后用机器去匹配每一个任务. 排序之后,在时间上满足当前任务的机器,必定也在时间上满足后面的机器,所以我们每次把时 ...

  8. HDU 4864 Task(贪心)

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

  9. HDU4864 Task

    题意 Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, t ...

随机推荐

  1. Ubuntu更新源问题终于解决了

    原文地址:http://chenrongya.blog.163.com/blog/static/8747419620143185103297/ 不同的网络状况连接以下源的速度不同, 建议在添加前手动验 ...

  2. 项目管理——WBS工作分解法

    首先我们要了解什么是WBS工作分解法 工作分解结构(Work Breakdown Structure,简称WBS)跟因数分解是一个原理,就是把一个项目,按一定的原则分解,项目分解成任务,任务再分解成一 ...

  3. mtd-utils 安装

    title: mkdosfs 安装 tags: linux date: 2018/12/26/ 17:08:54 --- mtd-utils安装 for 主机 在制作根文件系统中需要使用它制作jffs ...

  4. busybox(二)编译

    title: busybox(二)编译 tag: arm date: 2018-11-13 23:14:58 --- busybox(二)编译 解压,源码包在busybox-1.7.0.tar.bz2 ...

  5. Hadoop记录- Yarn scheduler队列采集

    #!/bin/sh ip=10.116.100.11 port=8088 export HADOOP_HOME=/app/hadoop/bin rmstate1=$($HADOOP_HOME/yarn ...

  6. 2018-2019-2 实验一 Java开发环境的熟悉

    实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA编辑.编译.运行.调试Java程序 实验知识点 1. JVM.JRE.JDK的安装位置与区别: 2. 命令行运行javac:ja ...

  7. MySQL学习笔记(六)MySQL8.0 配置笔记

    今天把数据库配置文件修改了,结果重启不了了 需要使用 mysqld --initialize 或 mysqld --initialize-insecure 命令来初始化数据库 1.mysqld --i ...

  8. NOI-OJ 1.13 ID:34 确定进制

    整体思路 对于任意的p,q,r,可能使得p*q=r的最小进制应该是p,q,r三个数的所有数位中最大的数字+1,例如,6,9,42三个数中所有数位中最大的数字是9,故可能成立的最小进制是9+1,即10. ...

  9. POJ 2318 TOYS (叉积+二分)

    题目: Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom and ...

  10. 看完此文还不懂NB-IoT,你就过来掐死我吧...【转】

    转自:https://www.cnblogs.com/pangguoming/p/9755916.html 看完此文还不懂NB-IoT,你就过来掐死我吧....... 1 1G-2G-3G-4G-5G ...