LeetCode#826-安排工作达到最大收益
package shuangzhizhen; import java.awt.*; import java.util.Arrays; /* 826. 安排工作以达到最大收益 有一些工作: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] 解题思路: 首先排序, 然后双指针从后向前遍历 */ public class p826 { //通过率:51/57 /*public static int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) { int n=difficulty.length; Point p[]=new Point[n]; for(int i=0;i<n;i++){ p[i]=new Point(difficulty[i],profit[i]); } Arrays.sort(worker); Arrays.sort(p,(a,b)->a.x-b.x); int j=n-1,res=0; for(int i=worker.length-1;i>=0;i--){ while (worker[i]<p[j].x) { j--; } res+=p[j].y;; } return res; }*/ public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) { int N = difficulty.length; Point[] jobs = new Point[N]; for (int i = 0; i < N; ++i) jobs[i] = new Point(difficulty[i], profit[i]); Arrays.sort(jobs, (a, b) -> a.x - b.x); Arrays.sort(worker); int ans = 0, i = 0, best = 0; for (int skill: worker) { while (i < N && skill >= jobs[i].x) best = Math.max(best, jobs[i++].y); ans += best; } return ans; } static class t{ int x; int y; public t(int x,int y){ this.x=x; this.y=y; } } public static void main(String[] args) { int d[]={2,4,6,8,10}; int p[]={10,20,30,40,50}; int w[]={4,5,6,7}; System.out.println(maxProfitAssignment(d,p,w)); /*t t1[]=new t[3]; t1[0]=new t(2,3); t1[1]=new t(3,3); t1[2]=new t(1,3); Arrays.sort(t1,(a,b)->a.x-a.y); System.out.println(t1[0].x); System.out.println(t1[1].x);System.out.println(t1[2].x);*/ } }
运行结果: