算法题解----leetcode.826.安排工作以达到最大收益

先来吐槽一件事,今天我在配置tomcat的时候环境变量整了半天才弄好,然后又要整合idea和javaweb,

最坑爹的来了,我之前用的是idea社区版本,没有javaee,我也不会配置,就很烦,我又没钱买旗舰版,

然后下了个edu版,还是不太行,总之忙活了一两个小时还没搞好,心态小炸,

原本我还在为我终于看不到html css javascript那些我一看到就想吐的东西而窃喜(没有其他的意思,就是我是真的不喜欢学前端,看到<>标签莫名想吐hh)。

言归正传,我们来看看今天的题解.

题目描述:

 

有一些工作:difficulty[i] 表示第 i 个工作的难度,profit[i] 表示第 i 个工作的收益。

现在我们有一些工人。worker[i] 是第 i 个工人的能力,即该工人只能完成难度小于等于 worker[i] 的工作。

每一个工人都最多只能安排一个工作,但是一个工作可以完成多次。

举个例子,如果 3 个工人都尝试完成一份报酬为 1 的同样工作,那么总收益为 $3。如果一个工人不能完成任何工作,他的收益为 $0 。

我们能得到的最大收益是多少?

 

示例:

 

输入: difficulty = [2,4,6,8,10], profit = [10,20,30,40,50], worker = [4,5,6,7]
输出: 100 
解释: 工人被分配的工作难度是 [4,4,6,6] ,分别获得 [20,20,30,30] 的收益。

 

提示:

 

1 <= difficulty.length = profit.length <= 10000
1 <= worker.length <= 10000
difficulty[i], profit[i], worker[i]  的范围是 [1, 10^5]

 

 

这题我的思路是这样的:

开一个map,key存的是困难度,value存的是相应困难度的最大收益,这里因为它有可能两件工作困难度相同但是收益不同,我们肯定取最大值。

然后把工人的能力排个序,声明一个迭代器指向建好的map的begin()位置,遍历排过序的工人数组,这时候要用一个小技巧,设置一个mx存储

map里面困难度小于等于工人能力值的工作的最大收益,这样它的时间复杂度只有O(n+m),再加上之前我们排序的时间复杂度,这题的时间复杂度就是O(nlogn)

范围是10^5,完全可以过,看看代码~

 

class Solution {
public:

    int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<int>& worker) {
        map<int,int> m;
        for(int i=0;i<difficulty.size();i++)
        {
            if(m.find(difficulty[i]) == m.end())
            m.insert(make_pair(difficulty[i],profit[i]));
            else if(m.find(difficulty[i])->second<profit[i])
            m.find(difficulty[i])->second = profit[i];
        }
        sort(worker.begin(),worker.end());
        int res = 0;
        int mx = 0;
        map<int,int>::iterator iter = m.begin();
        for(int i=0;i<worker.size();i++)
        {
            while(iter!=m.end() && worker[i]>=(*iter).first) 
            {
              mx = max(mx,(*iter).second);
              iter++;  
            }
            res += mx;
        }
        return res;
    }
};

 

上一篇:负载均衡理论


下一篇:Golang网课-worker pool练习