LeetCode Weekly Contest 82: Most Profit Assigning Work

本文介绍了一种算法,用于解决如何将不同难度的工作最优地分配给具备不同能力的工人,以达到最大化的总收益。该算法通过预处理难度与利润的关系,并采用动态规划思想来高效求解。

Most Profit Assigning Work

We have jobs: difficulty[i] is the difficulty of the ith job, and profit[i] is the profit of the ith job.

Now we have some workers. worker[i] is the ability of the ith worker, which means that this worker can only complete a job with difficulty at most worker[i].

Every worker can be assigned at most one job, but one job can be completed multiple times.

For example, if 3 people attempt the same job that pays 1,thenthetotalprofitwillbe 3. If a worker cannot complete any job, his profit is $0.

What is the most profit we can make?

Example 1:

Input: difficulty = [2,4,6,8,10], profit = [10,20,30,40,50], worker = [4,5,6,7]
Output: 100 
Explanation: Workers are assigned jobs of difficulty [4,4,6,6] and they get profit of [20,20,30,30] seperately.

Notes:

  • 1 <= difficulty.length = profit.length <= 10000
  • 1 <= worker.length <= 10000
  • difficulty[i], profit[i], worker[i] are in range [1, 10^5]

Solution 1

// by   JOHNKRAM
class Solution {
public:
    int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<int>& worker) {
        int a[100005],n=difficulty.size(),m=worker.size(),ans=0,i;
        memset(a,0,sizeof(a));
        for(i=0;i<n;i++)
            a[difficulty[i]]=max(a[difficulty[i]],profit[i]);  // 每种难度只保留最大利润值
        for(i=1;i<=100000;i++)
            a[i]=max(a[i],a[i-1]);  // 若低难度有更大利润,则更新高难度的利润
        for(i=0;i<m;i++)
            ans+=a[worker[i]];  // 求和即得结果
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值