2014杭电多校联合第一场Task(贪心+STL使用)
来源:互联网 发布:yeezy抢鞋软件 编辑:程序博客网 时间:2024/05/22 02:14
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864
题意:某公司有m个任务需要完成。第i个任务需要xi的时间来完成。同时,该任务还有一个难度系数level yi。如果一个机器的难度系数小于level yi,
则该机器不能处理该任务。如果该公司完成了一个任务,则能获得500*xi+2*yi的收益。
该公司有n台机器,每个机器有一个最大工作时间xi,该时间只有大于任务需要的时间且该机器的难度系数大于任务的难度系数时,该机器才能处理
该任务。 每个机器每天只能处理一个任务。
求该公司能获得的最大收益。
思路:贪心。我觉得这道题贪心的时候,很容易想当然,认为机器的时间和等级尽量大去满足一个任务。
也就是说,需要对机器的时间和等级按照降序排列,对任务也做同样处理。然后,再去一个个对应。而这样
是错误的。以下几组数据可以验证这个方法的错误:
machine task
100 6 100 3
100 3 50 5
——————————
200 2 150 2
150 10 100 10
——————————
70 4 40 6
30 2 40 3
正确的方法是:对于价值c=500*xi+2*yi,yi最大影响100*2<500,所以就是求xi总和最大。可以先对机器和任务的时间从大到小排序。
从最大时间的任务开始,找出满足任务时间要求的所有机器,从中找出等级最低且满足任务等级要求的机器匹配。依次对任务寻找满足要求的机器。
(以上内容来自杭电官方解题报告)加粗的那句话是关键。
贪心准则找到了,下面就是怎么找这个等级最低的机器的问题了。一般找法就是暴力啦,果断TLE。然后想到要用二分查找。但是在匹配过程中,机器是
要被删除的,这样就不能实现一般的二分了(用数组存储的)。
然后,就用STL了。。这个具体看程序吧。
#include<cstdio>#include<string.h>#include<iostream>#include<cstring>#include<map>#include<algorithm>#define MAX 100005using namespace std;int n,m;map<int,int> mapp;struct machine{ int minute,level;}mach[MAX];struct Task{ int minute,level;}task[MAX];int cmp(Task a,Task b){ if(a.minute==b.minute) return a.level>b.level; return a.minute>b.minute;}int cnp(machine a,machine b){ if(a.minute==b.minute) return a.level>b.level; return a.minute>b.minute;}int main(){ __int64 money; int cnt,i,j; while(scanf("%d%d",&n,&m)!=EOF) { money=0; cnt=0; for(i=0;i<n;i++) scanf("%d%d",&mach[i].minute,&mach[i].level); for(i=0;i<m;i++) scanf("%d%d",&task[i].minute,&task[i].level); sort(task,task+m,cmp); sort(mach,mach+n,cnp); mapp.clear(); j=0,cnt=0,money=0; for(i=0;i<m;i++) { while(j<n&&mach[j].minute>=task[i].minute) { mapp[mach[j].level]++; //把满足时间要求的所有机器选出来 j++; } map<int,int>::iterator it=mapp.lower_bound(task[i].level); //二分查找 if(it!=mapp.end()) { cnt++; money+=(task[i].minute*500)+task[i].level*2; int t=it->first; mapp[t]--; //删除对应的机器,用STL的优势就体现在这里啦 if(mapp[t]==0) //不影响整体 mapp.erase(t); } } printf("%d %I64d\n",cnt,money); }}
- 2014杭电多校联合第一场Task(贪心+STL使用)
- HDU 4864 Task (2014多校联合训练第一场1004) 解题报告(贪心)
- 2014多校联合第一场 1004 Task
- hdu-4864 Task 2014多校联赛第一场 贪心
- HDU 4864 Task(2014多校第一场1004)(贪心)
- hdu5289||2015多校联合第一场1002贪心+RMQ
- HDU4864 Task (2014多校第一场D题)
- 2014杭电多校联合第一场Jump费用流(最小K路径覆盖)
- 杭电多校联合第一场hdu4606 occupy cities
- 2014多校联合第一场
- 多校联合赛第二场Mammum Sequence(贪心)
- 2013年多校联合第一场
- hdu 4865 Peter's Hobby(2014 多校联合第一场 E)
- hdu 4869 Turn the pokers (2014多校联合第一场 I)
- 2014多校联合第一场 1002 Jump
- hdu 4861 Couple doubi 2014年多校联合第一场
- HDU 5289 Assignment(多校联合第一场1002)
- 2017年多校联合训练 第一场(北航)
- JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载
- Delphi 常用控件之TlistView总结
- jQuery_review 之 通过.load()方法来实现异步加载HTML文档
- 线段树,最大最小值
- java面向对象-抽象类abstract
- 2014杭电多校联合第一场Task(贪心+STL使用)
- NT4源码编译环境
- 查询出Exchange Server的通讯组,并将通讯组成员输出到本地的文本文件中!
- jpa截图
- Qt中的元对象系统
- 这里是技术论坛啊!我怎么净写些与技术无关的东西。
- C语言入门——C语言学习日志1
- java面向对象-抽象类示例
- 后台管理系统,会员后台管理系统等系统的发布,解决80端口动态IP无公网