算法题解----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; } };
标签:map,leetcode.826,int,题解,收益,worker,----,工人,mx 来源: https://www.cnblogs.com/apakchan/p/15187663.html