HDU 4864 Task(贪心)




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;
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值