10346 带价值的作业安排问题

10346 带价值的作业安排问题


10346 带价值的作业安排问题)

题目

Description
已知n项作业E={1, 2, … ,n} 需要完成,只有一台机器,同一时刻至多完成一个作业,
而且每项作业需要的时间都是单位时间1。第k项作业要求在时间fk时刻执行并完成,而且
完成这项作业将获得效益pk,(k=1, 2, … , n)。

E的子集称为相容的,如果它们可以被安排由一台机器完成。

带限期和价值的作业安排问题就是:要在所给的作业集合中选出总效益值最大的相容子集,
请输出最大的总效益值。

输入格式
输入3行:
第一行,一个数n,表示n个作业(n<10000)。
第二行,n个正数,表示这n个作业的应执行的时间点。
第三行,n个正数,表示这n个作业的效益值。

输出格式
输出:相容作业子集所获得的最大总效益。

例如:7个作业
时间点和效益值分别是:
1 8 8 5 9 3 5
20 25 30 7 18 10 18
则:可以获得的最大总效益为:20 + 30 + 18 + 10 + 18 = 96

输入样例
7
1 8 8 5 9 3 5
20 25 30 7 18 10 18

输出样例
96

提示

贪心法
1)按价值从高到低排序所有作业;
2)纳入作业1;
3)从作业2到作业n,逐个检测是否和已经纳入的作业相容,相容则添入“相容作业集合”中。
此处,相容的判断不同于书上的活动安排问题,因为每个作业仅需一个单位时间就可完成,
所以每当判断一个新的作业是否可以加入进已有的相容作业集合,就看这个新的作业是否
能在其执行时间内被安排。

代码

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int hash[100000] = {};
    int n;
    cin >> n;
    vector<int> a(n), b(n);
    for(int i = 0; i < n; i++) cin >> a[i];
    for(int i = 0; i < n; i++) cin >> b[i];

    for(int i = 0; i < n; i++) hash[a[i]] = max(hash[a[i]], b[i]);

    int ans = 0;
    for(int i = 0; i < 10000; i++) ans += hash[i];
    cout << ans << endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值