hdu 4864 Task

hdu4864

链接:点击打开链接

题目要求:

一共有n个任务,m台机器,每个任务有他的完成所需时间和难度等级,每台机器也有最长工作时间和等级,一个任务只能一台机器做,一台机器只能用在一个任务上。每完成一个任务,可得到r(i)的收益。求最多能做几个任务,如果个数一样多,则求最大收益。

题目思路:

设结构体数组ma[ ],ta[ ],因为r(i)=ta[i].t*500+ta[i].l*2,ta[i].l范围为0~100,则不管多高也不会比多一秒时间高,所以将任务数组按时间从大到小排列,时间相同时按等级从大到小排列(先解决难的)。之后在每个任务遍历,将机器时间比当前任务时间大时记录机器等级,最后选取记录的机器中能解决的等级最低的,因为虽然下面的时间都能满足前面的时间,但是下面的等级可能会更大,所以要把更大的留给后面的


代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct bay
{
    int t;
    int l;
}ma[100005],ta[100005];
bool cmp(bay a,bay b)
{
    if(a.t==b.t) return a.l>b.l;
    else return a.t>b.t;
}
int main()
{
    int n,m,i,cnt[105],j;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d %d",&ma[i].t,&ma[i].l);
        }
        for(i=0;i<m;i++)
        {
            scanf("%d %d",&ta[i].t,&ta[i].l);
        }
        sort(ma,ma+n,cmp);
        sort(ta,ta+m,cmp);
        fill(cnt,cnt+105,0);
        __int64 sum=0;
        int j=0,cnt1=0;
        for(i=0;i<m;i++)
        {
            while(ma[j].t>=ta[i].t && j<n)
            {
                cnt[ma[j].l]++;
                j++;
            }
            for(int k=ta[i].l;k<101;k++)
            {
                if(cnt[k])
                {
                    cnt[k]--;
                    sum+=500*ta[i].t+2*ta[i].l;
                    cnt1++;
                    break;
                }
            }
        }
         printf("%d %I64d\n",cnt1,sum);
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值