hdu 4864 Task(贪心)
2015-07-12 19:48
417 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4864
n台机器,m个任务,每台机器和任务都有两个值,机器的两个值time, level都大于或等于任务time,level时,这台机器才能完成这个任务,每台机器只能完成一个任务,完成一个任务就能增加5*time+2*level,问最大的任务完成量,如果完成量相同求出最大的结果值。
主要按照时间从大到小排序(因为它的影响很大),时间相同时参照level大小排序,也从大到小。然后一个一个机器和任务PK吧,但是这么做是错的啊:
中间的代码构思真巧妙啊,不知道最开始是谁先想到的。感觉这种思路确实更加严谨,但其实我对自己原先的想法仍然不知道哪里出错了。
n台机器,m个任务,每台机器和任务都有两个值,机器的两个值time, level都大于或等于任务time,level时,这台机器才能完成这个任务,每台机器只能完成一个任务,完成一个任务就能增加5*time+2*level,问最大的任务完成量,如果完成量相同求出最大的结果值。
主要按照时间从大到小排序(因为它的影响很大),时间相同时参照level大小排序,也从大到小。然后一个一个机器和任务PK吧,但是这么做是错的啊:
#include <iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=1e5+10; struct node{ int time,level; }ma[maxn],ta[maxn]; bool cmp(node a,node b){ if(a.time>b.time)return 1; if(a.time==b.time&&a.level>b.level)return 1; return 0; } int main() { //freopen("cin.txt","r",stdin); int n,m; while(cin>>n>>m){ memset(ma,0,sizeof(ma)); memset(ta,0,sizeof(ta)); int i,j; for(i=0;i<n;i++)scanf("%d%d",&ma[i].time,&ma[i].level); for(i=0;i<m;i++)scanf("%d%d",&ta[i].time,&ta[i].level); sort(ma,ma+n,cmp); sort(ta,ta+m,cmp); i=0; j=0; long long cnt=0,sum=0; while(i<n&&j<m){ //这里是出错点 if(ma[i].time>=ta[j].time&&ma[i].level>=ta[j].level){ sum+=(500*ta[j].time+2*ta[j].level); i++; cnt++; } j++; } printf("%lld %lld\n",cnt,sum); } return 0; }后来网上搜了才知道对每个task选择满足先决条件(time)的最小level值的机器才行。
#include <iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=1e5+10; struct node{ int time,level; }ma[maxn],ta[maxn]; int c[105]; bool cmp(node a,node b){ if(a.time==b.time)return a.level>b.level; return a.time>b.time; } int main() { //freopen("cin.txt","r",stdin); int n,m; while(cin>>n>>m){ memset(ma,0,sizeof(ma)); memset(ta,0,sizeof(ta)); int i,j,k; for(i=0;i<n;i++)scanf("%d%d",&ma[i].time,&ma[i].level); for(i=0;i<m;i++)scanf("%d%d",&ta[i].time,&ta[i].level); sort(ma,ma+n,cmp); sort(ta,ta+m,cmp); memset(c,0,sizeof(c)); int cnt=0; long long sum=0; for(i=0,j=0;i<m;i++){ //不同的地方 while(j<n&&ma[j].time>=ta[i].time){ c[ma[j].level]++; j++; } for(k=ta[i].level;k<=100;k++){ if(c[k]){ cnt++; c[k]--; sum=sum+500*ta[i].time+2*ta[i].level; break; } } } printf("%d %I64d\n",cnt,sum); } return 0; }
中间的代码构思真巧妙啊,不知道最开始是谁先想到的。感觉这种思路确实更加严谨,但其实我对自己原先的想法仍然不知道哪里出错了。
相关文章推荐
- Java语言基础1--专题课 拆数
- Binary Tree Postorder Traversal
- Hdu 5113 Black and White ---2014北京现场赛B题
- ASPxPopupControl PopupWindow使用方法
- unity3d热更新插件uLua学习整理
- 第三章:Java语言基础II 第9、10节 综合案例 算命程序
- teamviewer不能传输XP计算机声音
- House Robber (leetcode 198)
- linux下几种目标文件的分析
- NSHashTable的特性和使用
- 轻量级分布式 RPC 框架DIY(转)
- 快速排序
- kvm主机重命名
- 数组中只出现一次的数
- Android--Handler与Message
- 设备信息
- libevent(一) socket属性设置与初始化操作
- The Great Wall I (zoj 3475 最小割最大流)
- 阿里中间件开源产品
- PAT 数据结构 04-树6. Huffman Codes (30)