HDU 4864 Task

本文介绍了一种基于贪心算法的任务分配方案,旨在最大化公司一天内能完成的任务数量,并在此基础上尽可能获得更多的经济收益。该算法首先将任务按完成时间和难度级别进行排序,然后寻找能满足条件的最合适的机器来执行这些任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Task

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 893    Accepted Submission(s): 201


Problem Description
Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task has a difficulty level yi. The machine whose level below this task’s level yi cannot complete this task. If the company completes this task, they will get (500*xi+2*yi) dollars.
The company has n machines. Each machine has a maximum working time and a level. If the time for the task is more than the maximum working time of the machine, the machine can not complete this task. Each machine can only complete a task one day. Each task can only be completed by one machine.
The company hopes to maximize the number of the tasks which they can complete today. If there are multiple solutions, they hopes to make the money maximum.
 

Input
The input contains several test cases.
The first line contains two integers N and M. N is the number of the machines.M is the number of tasks(1 < =N <= 100000,1<=M<=100000).
The following N lines each contains two integers xi(0<xi<1440),yi(0=<yi<=100).xi is the maximum time the machine can work.yi is the level of the machine.
The following M lines each contains two integers xi(0<xi<1440),yi(0=<yi<=100).xi is the time we need to complete the task.yi is the level of the task.
 

Output
For each test case, output two integers, the maximum number of the tasks which the company can complete today and the money they will get.
 

Sample Input
1 2 100 3 100 2 100 1
 

Sample Output
1 50004
用贪心做,因为要求得到最大任务数,在最大任务数情况下有多种情况则求所能得到的最大金钱,而每个任务所能得到的金钱数为(500*xi+2*yi),level最大为100,而500 > 2*100,所以先把任务按时间降序排序,在时间排序相等的情况下再按level降序排序,然后从第一个任务开始,在机器中找level等级最低的,时间刚好满足的机器,如果时间都满足不了,再往上跳一个等级找,以此类推。

AC代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m;
int mact[101][1441];
int macl[101];
typedef struct
{
    int t, l;
}Node;
Node task[100005];
bool cmp(Node a, Node b)
{
    if(a.t != b.t)  return a.t > b.t;
    return a.l > b.l;
}
int main()
{
//    freopen("1004.in", "r", stdin);
//    freopen("1004.out", "w", stdout);
    int x, y;
    while(scanf("%d%d", &n, &m) != EOF)
    {
        memset(macl, 0, sizeof(macl));
        memset(mact, 0, sizeof(mact));
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d", &x, &y);
            macl[y]++;
            mact[y][x]++;
        }
        for(int i = 0; i < m; i++)
            scanf("%d%d", &task[i].t, &task[i].l);
        sort(task, task + m, cmp);
        __int64 sum = 0;
        int num = 0;
        for(int i = 0; i < m && n - num > 0; i++)
        {
            bool judge = true;
            for(int j = task[i].l; j < 101 && judge; j++)
            {
                if(macl[j])
                {
                    for(int k = task[i].t; k < 1441 && judge; k++)
                    {
                        if(mact[j][k])
                        {
                            macl[j]--;
                            mact[j][k]--;
                            judge = false;
                            sum += (500*task[i].t + 2*task[i].l);
                            num++;
                        }
                    }
                }
            }
        }
        printf("%d %I64d\n", num, sum);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值