http://acm.hdu.edu.cn/showproblem.php?pid=4864
题目大意:
公司有m个任务需要完成 任务有完成任务需要的时间和任务的难度 现在有n个机器来完成任务 机器有最长工作时间和机器的级别 机器级别小于任务难度或者最长工作时间小于任务完成所需要的时间的机器不能来完成这个任务 完成一项任务可以获得 500×时间+2×难度 的报酬 问怎样安排才能使获得的报酬最大
分析:
只有时间和级别都大于任务的机器才能完成这项任务 其中任务完成需要的时间对报酬起着决定性的作用 要使获得的报酬最高也就是完成越多时间长的任务
机器和任务按照时间降序排列 让任务去找机器 在机器的时间符合要求的前提下找到一个级别最小的能满足任务难度要求的机器来完成这项任务 按时间从大到小找完所有机器 就能够的得到答案 特别注意机器只能用一次 最开始没做出来看了题解以后才明白的
AC代码:
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
struct node{
int xi;
int yi;
}a[100005],b[100005];
int cmp(node x,node y){
if (x.xi==y.xi)
return x.yi>y.yi;
return x.xi>y.xi;
}
int vis[105];
int main (){
int N,M;
while (scanf ("%d%d",&N,&M)!=EOF){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(vis,0,sizeof(vis));
for (int i=0;i<N;i++){
scanf ("%d%d",&a[i].xi,&a[i].yi);
}
for (int i=0;i<M;i++){
scanf ("%d%d",&b[i].xi,&b[i].yi);
}
sort(a,a+N,cmp);
sort(b,b+M,cmp);
long long ans=0;
long long count=0;
for (int i=0,j=0;i<M;i++){
while(j<N&&a[j].xi>=b[i].xi){
vis[a[j].yi]++; // 找到时间符合要求的机器 ++表示在该任务难度下有几个满足任务的机器
j++;// 由于时间按降序排列 所以之前的时间符合要求的机器肯定符合后边的任务
}
for(int k=b[i].yi;k<=100;k++){// 任务难度从机器本身增加 找合适的机器
if (vis[k]){// 找到合适的机器 这里时间已经符合要求 只需判断是不是符合任务难度
count++;
ans+=500*b[i].xi+2*b[i].yi;
vis[k]--;// 级别符合任务难度的机器被使用
break;
}
}
}
printf ("%lld %lld\n",count,ans);
}
return 0;
}