HDU4864(机器数和任务数、贪心)

本文解析了一道杭电在线评测系统上的竞赛题目,通过使用C++编程语言实现了一个解决方案,该方案涉及任务调度算法,包括对任务和机器进行排序、匹配等操作,最终输出最优解。

http://acm.hdu.edu.cn/showproblem.php?pid=4864
这是一道我见过至少三遍的题,每一遍都没有做出来,我立志要把它A掉!

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

int n, m;//n个机器,m个任务

struct Task
{
    int xi, yi;
}task[100005];

struct Machine
{
    int time;
    int level;
}machine[100005];

int occupy[100005];
vector<Task>finish;

bool cmp1(Task &a, Task &b)
{
    if (a.xi == b.xi)
        return a.yi > a.yi;
    return a.xi > b.xi;
}

bool cmp2(Machine &a, Machine &b)
{
    if (a.time == b.time)
        return a.level < b.level;
    return a.time < b.time;
}

int main()
{
    while (cin >> n >> m)
    {
        int i;
        for (i = 1; i <= n; i++)
            cin >> machine[i].time >> machine[i].level;

        for (i = 1; i <= m; i++)
            cin >> task[i].xi >> task[i].yi;

        int maxmoney = 0;

        memset(occupy, 0, sizeof(occupy));
        finish.clear();

        sort(task + 1, task + m, cmp1);
        sort(machine + 1, machine + n, cmp2);

        int j;

        for (i = 1; i <= m; i++)
        {
            for (j = 1; j <= n; j++)
            {
                if (machine[j].level >= task[i].yi&&machine[j].time >= task[i].xi&&occupy[j] == 0)
                {
                    finish.push_back(task[i]);
                    occupy[j] = 1;
                    break;
                }
            }
        }

        cout << finish.size() << " ";
        for (i = 0; i < finish.size(); i++)
            maxmoney += 500 * finish[i].xi + 2 * finish[i].yi;
        cout << maxmoney << endl;

    }
    return 0;
}

并不知道过没过,杭电OJ在做ccpc的网络选拔赛,结束之后我就过去交。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值