JAVA程序设计:雇佣 K 名工人的最低成本(LeetCode:857)

有 N 名工人。 第 i 名工人的工作质量为 quality[i] ,其最低期望工资为 wage[i] 。

现在我们想雇佣 K 名工人组成一个工资组。在雇佣 一组 K 名工人时,我们必须按照下述规则向他们支付工资:

对工资组中的每名工人,应当按其工作质量与同组其他工人的工作质量的比例来支付工资。
工资组中的每名工人至少应当得到他们的最低期望工资。
返回组成一个满足上述条件的工资组至少需要多少钱。

示例 1:

输入: quality = [10,20,5], wage = [70,50,30], K = 2
输出: 105.00000
解释: 我们向 0 号工人支付 70,向 2 号工人支付 35。
示例 2:

输入: quality = [3,1,10,10,1], wage = [4,8,2,2,7], K = 3
输出: 30.66667
解释: 我们向 0 号工人支付 4,向 2 号和 3 号分别支付 13.33333。
 

提示:

1 <= K <= N <= 10000,其中 N = quality.length = wage.length
1 <= quality[i] <= 10000
1 <= wage[i] <= 10000
与正确答案误差在 10^-5 之内的答案将被视为正确的。

思路:对于本题,很明显的贪心思想是在这k名工人中,会有一人恰好拿到了他的最低期望工资,因此我们需要枚举是哪一位工人,并检查在满足当前的‘工资/质量’比的前提下,是否存在至少k-1名工人满足条件,若存在,我们需要找到其中的k-1个工人使得最终所要支付的工资和最小。

基于上述贪心思想,我们很容易想到一个O(n^2logn)的做法,基于n有10000这么大的条件,这种方法是不可取的,我们需要另辟蹊径,我们可以定义一个价值,表示工人最低期望工资与工作质量之比。可以发现,若一名工人的价值为R,当他拿的是最低工资时,所有价值高于R的工人都不会拿到最低期望工资,而所有价值低于R的工人都拿得比最低期望工资多(这里很简单,在纸上写一写就知道了,其实就是等式的移项,相信读者是可以懂的)。因此,我们按照这些工人的价值进行升序排序,并在遍历的过程中保留k-1个最优选择,之后更新答案即可。

扫描二维码关注公众号,回复: 11154653 查看本文章
class Solution {
	
	class node implements Comparable<node>{
		int qual,wage;
		public node(int qual,int wage) {
			this.qual=qual;
			this.wage=wage;
		}
		
		public double ratio() {
			return (double)wage/qual;
		}
		@Override
		public int compareTo(node o) {
			// TODO 自动生成的方法存根
			return Double.compare(ratio(), o.ratio());
		}
	}
	
    public double mincostToHireWorkers(int[] quality, int[] wage, int K) {
    	
    	int sum=0;
    	int n=wage.length;
    	node[] workers=new node[n];
    	double ans=Double.MAX_VALUE;
    	PriorityQueue<Integer> q=new PriorityQueue<>();
    	
    	for(int i=0;i<n;i++)
    		workers[i]=new node(quality[i],wage[i]);
    	
    	Arrays.parallelSort(workers);
    	
    	for(node worker : workers) {
    		q.add(-worker.qual);
    		sum+=worker.qual;
    		if(q.size()>K) 
    			sum+=q.poll();
    		if(q.size()==K)
    			ans=Math.min(ans, sum*worker.ratio());
    	}
    	
    	return ans;
    }
}
原创文章 1111 获赞 194 访问量 25万+

猜你喜欢

转载自blog.csdn.net/haut_ykc/article/details/105577013
今日推荐