题目描述
有一些工作: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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/most-profit-assigning-work
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
class Solution {
public:
static bool cmp(pair<int,int> &a,pair<int,int> &b){
if(a.first == b.first) return a.second<b.second;
return a.first<b.first;
}
int maxProfitAssignment(vector<int>& diff, vector<int>& profit, vector<int>& worker) {
vector<pair<int,int>> vect;
int len = profit.size(),ans = 0;
for(int i=0;i<len;++i) vect.push_back(make_pair(diff[i],profit[i]));
sort(vect.begin(),vect.end(),cmp);
sort(worker.begin(),worker.end());
int ll = worker.size(),i=0,j=0;
int premax = 0,curmax = vect[0].second;
while(i<ll){
if(j >= len) ans += curmax;
else{
while(j<len && vect[j].first<=worker[i]){
++j;
premax = curmax;
if(j<len) curmax = max(curmax,vect[j].second);
}
if(j>0) ans += premax;
}
++i;
}
return ans;
}
};