题目来源:HDOJ
一、题目介绍
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.

输入格式:
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.

输出格式:
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.

输入样例:
在这里给出一组输入。例如:

1 2
100 3
100 2
100 1

输出样例:
在这里给出相应的输出。例如:

1 50004

二、分析
(1)n个机器,m个任务。
(2)机器和任务都有两个指标:时间xi,难度系数yi
(3)机器可以执行任务的充要条件:机器的两个指标分别不小于任务的两个指标
(4) 一天一个机器最多执行一个任务,求一天最多执行多少任务,前者有多种方案时,使得盈利最多
(5)任务被执行盈利:500xi+2yi
三、我的错误思路

 (1)以“时间作为第一指标,难度系数作为第二指标”将机器和任务分别降序排列。(2)从i=j=0开始,每一个任务i,若机器j可以执行,则执行,i++,j++下个任务,下个机器(3)若任务i不能被机器j执行,则必然不能被后面的机器执行,此时i++,判断下一任务

反例:若按照以上思路,则第二个任务不能被执行

task m 2 (200,4) (100,5)
machine n 2 (200,5) (200,4)

四、正确思路

把所有时间大于等于任务的机器找出来,对于每个任务选取一个能完成它但难度y最小的机器来做。因为对于后面所有的任务,我们找出来的机器在时间上一定能完成,就看难度了。根据贪心的基本思想,潜力大的东西要留,所以如此。这样既能保证时间大的任务优先做,又能使各种难度的任务得到合适的分配。故其是优秀的贪心方案。

附上代码:

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;struct node
{int time;int level;
} mach[100000], task[100000];int lev[105];bool cmp(const node &a, const node &b)
{if (a.time == b.time)return a.level > b.level;return a.time > b.time;
}int main()
{int m, n;while (cin >> n >> m){int cnt = 0, j = 0;long long mon = 0; //数据量较大,防止溢出for (int i = 0; i < n; i++)cin >> mach[i].time >> mach[i].level;for (int i = 0; i < m; i++)cin >> task[i].time >> task[i].level;sort(mach, mach + n, cmp);sort(task, task + m, cmp);for (int i = 0; i < m; i++){while (mach[j].time >= task[i].time && j < n){lev[mach[j++].level]++;}for (int k = task[i].level;  k <= 100; k++){if (lev[k]){cnt++;mon += 500 * task[i].time + 2 * task[i].level;lev[k]--;break;}}}cout << cnt << " " << mon << endl;memset(mach, 0, sizeof(node) * n);memset(task, 0, sizeof(node) * m);memset(lev, 0, sizeof(lev));}return 0;
}

工厂机器安排(贪心算法)相关推荐

  1. c++工厂机器安排(贪心)

    题目为: Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, ...

  2. 活动安排--贪心算法C语言实现

    一.前言 大三下的算法设计分析课程.每周必备二道算法题.头疼.自己写的,大家看看就行.题目,我就截图 ,懒得赋文字了. 二.内容 代码: #include<stdio.h> typedef ...

  3. 活动安排(贪心算法)C/C++

    样例输入 4 10 1 3 2 4 5 7 9 10 样例输出 3 下面看一下一个贪心算法的典型例题 活动选择问题 有n个需要在同一天使用同一个教室的活动a1,a2,-,an,教室同一时刻只能由一个活 ...

  4. 信息学奥赛第九节 —— 贪心算法(需要安排几位师傅加工零件 + 排队打水问题)

    贪心算法的特点 对于问题求解时,总是做出在当前来看是最好的选择的策略,即贪心算法不从整体来考虑问题.贪心算法与排序.高精度.背包等算法不同,没有一个特定的模板来表达贪心算法的过程. 贪心的步骤 抽象出 ...

  5. 贪心算法--会场安排问题

    会场用来安排活动,每个活动有一个开始时间和一个结束时间,在某个活动的开始时间到结束时间这段范围内,其他活动不能再被安排,求最多能安排多少场活动. #include<stdio.h> #in ...

  6. 活动安排问题--贪心算法

    活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...

  7. 算法设计与分析——贪心算法——活动安排问题

    问题描述:设有n个活动的集合E={1,2,-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源. 每个活动i都有一个要求使用该资源的起始时间si和一个结束时 ...

  8. C语言会场安排问题贪心算法,贪心算法解决会场安排问题多处最优服务次序问题(含源代码).doc...

    贪心算法解决会场安排问题多处最优服务次序问题(含源代码) 西 安年月日-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源 ...

  9. 贪心算法《活动时间安排问题》

    活动安排问题 问题表述:设有n个活动的集合E = {1,2,-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源. 每个活i都有一个要求使用该资源的起始时间 ...

最新文章

  1. 10多所高校发布通知: 今年研究生复试或有变!
  2. oracle 测试sql执行时间_通过错误的SQL来测试推理SQL的解析过程
  3. 互联网协议 — TLS — SNI
  4. WEB中get请求和post请求的区别
  5. SNMP协议介绍和操作截图
  6. qscrollbar 固定滑块大小_五金模具设计:通用滑块结构形式!模具滑块的设计标准!值得收藏...
  7. 【2012百度之星资格赛】G:聊天就是Repeat
  8. 教你如何写框架------用中文构建脚本
  9. java从控制台读取字符串_从控制台读取Java字符串
  10. typescript之prototype
  11. 微博表情 文本与图片对照表
  12. C语言 怎样定义函数
  13. 从巴菲特身上学习到的投资哲学
  14. Java爬虫彼岸桌面壁纸(使用httpClient+Jsoup)
  15. 多项式计算的Horner 方法
  16. 墨盒和墨仓打印机区别?
  17. 利用VBA在EXCEL 获取网页上的天气
  18. 天池-金融风控训练营-task5-模型融合
  19. 《两化融合 数字化转型 价值效益参考模型》国家标准全文
  20. c# distinct用法

热门文章

  1. 解决“windows已经阻止此软件因为无法验证发行者”方法
  2. PPPoE获取到32位掩码的研究
  3. 神了!有人用一个项目把23种设计模式与六大原则融会贯通了
  4. 计网必会:HTPP详解(非常全面)、cookie、缓存
  5. es数据类型 long造成的sum求和为0的问题
  6. 三菱梯形图转换c语言软件,三菱梯形图转51单片机软件使用程序超过100步又要使用软件的朋友.pdf...
  7. 最详细的A/B test 原理
  8. 计算机编程里面counter是什么意思,step在计算机编程中的意思是什么
  9. java毕业设计项目基于JavaWeb酒店管理系统开发与设计
  10. ORA-00937:不是单组分组函数 ORA-22818:这里不允许出现子查询表达式