HDU 4864 Task

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值