Minimum Cost to Hire K Workers

Updated on 10 June, 2025
Minimum Cost to Hire K Workers header image

Problem Statement

In this problem, our task is to efficiently determine the minimal wage expense required to form a paid group of exactly k workers from a given set of n workers. Each worker has two attributes: their quality, which reflects their capability or skill level, and their wage, the minimum wage they are willing to accept to be part of the group.

The challenge lies in meeting two main conditions:

  1. Every worker in the chosen group must receive at least their specified minimum wage.
  2. The payment of each worker within the group is proportional to their quality relative to the other workers in the group. For instance, a worker with double the quality of another should receive double the wage.

The goal is to find the minimum total wage expenditure to hire exactly k workers under these conditions.

Examples

Example 1

Input:

quality = [10,20,5], wage = [70,50,30], k = 2

Output:

105.00000

Explanation:

We pay 70 to 0th worker and 35 to 2nd worker.

Example 2

Input:

quality = [3,1,10,10,1], wage = [4,8,2,2,7], k = 3

Output:

30.66667

Explanation:

We pay 4 to 0th worker, 13.33333 to 2nd and 3rd workers separately.

Constraints

  • n == quality.length == wage.length
  • 1 <= k <= n <= 104
  • 1 <= quality[i], wage[i] <= 104

Approach and Intuition

The key to solving this problem lies in the proportional relationship between quality and wage among the chosen workers. The primary approach involves:

  1. Calculate the "wage per quality unit" for every worker. This is determined by dividing the minimum wage by the quality of each worker. This ratio indicates the minimum amount that should be paid per unit of quality if that specific worker's wage expectation becomes a baseline.

  2. Sort workers based on their "wage per quality unit" in ascending order. This step helps in prioritizing workers who offer a better wage rate per quality unit, which is crucial for minimizing the total wage expenditure.

  3. Use a minimum heap or similar data structure to maintain the total quality of currently considered workers. As we iterate through the sorted list (from step 2), we add the quality of each worker to the heap until we have considered k workers. For each new worker added from the list, if the group exceeds k workers, we remove the worker with the highest quality from the heap to keep the group size fixed at k.

  4. For each k-sized group formed during the iteration, calculate the potential total wage using the highest "wage per quality unit" among these k workers (acting as the scaling factor) and the sum of their quality from the heap. This gives us the minimum possible wage we could pay this group while satisfying the given constraints of proportionality and minimum wage expectations.

  5. Out of all possible k-sized groups, the one with the minimum total wage is our answer.

This approach achieves a balance between the given constraints and operational efficiency by focusing on the wage-quality ratio and managing the group's composition dynamically. The utilization of sorting and heap data structures are essential in efficiently managing and iterating through potential group compositions to find the optimal solution.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
public:
    double findMinimumCost(vector<int>& quality, vector<int>& wage, int k) {
        int n = quality.size();
        double minCost = numeric_limits<double>::max();
        double totalQuality = 0;
        vector<pair<double, int>> ratioQuality;

        for (int i = 0; i < n; i++) {
            ratioQuality.emplace_back(
                static_cast<double>(wage[i]) / quality[i], quality[i]);
        }

        sort(ratioQuality.begin(), ratioQuality.end());

        priority_queue<int> maxQuality;

        for (int i = 0; i < n; i++) {
            maxQuality.push(ratioQuality[i].second);
            totalQuality += ratioQuality[i].second;

            if (maxQuality.size() > k) {
                totalQuality -= maxQuality.top();
                maxQuality.pop();
            }

            if (maxQuality.size() == k) {
                minCost = min(minCost, totalQuality * ratioQuality[i].first);
            }
        }
        return minCost;
    }
};

The given C++ solution addresses the problem of finding the minimum cost required to hire K workers with constraints on wages relative to their quality. The solution employs a strategy using vectors, pair, and a priority queue to facilitate efficient calculation.

Here’s the detailed breakdown of the solution implementation:

  • Initialization:

    • minCost is set to the maximum possible double value as the initial minimum.
    • totalQuality accumulates the total quality of the selected K workers.
    • ratioQuality is a vector that stores pairs composed of the computed ratio of wage to quality for each worker along with the quality.
  • Worker Sorting by Wage-Quality Ratio:

    • Populate the ratioQuality vector with workers' data. The ratio is computed by dividing the worker’s wage by their quality.
    • Sort ratioQuality to prioritize workers with the least wage demand per quality unit, making it cost-effective.
  • Quality Accumulation and Cost Calculation:

    • Utilize a max priority queue maxQuality to keep the quality values of the workers.
    • Traverse through the sorted ratioQuality. For each worker:
      • Add worker’s quality to the total and to maxQuality.
      • If maxQuality exceeds the desired number K, remove the worker with the highest quality to keep the group optimal.
      • When the group size reaches K, calculate the possible cost based on the current ratio and compare it with minCost to find the minimal required expenditure.
  • Return:

    • After iterating through all the possibilities, the minCost will hold the lowest cost to hire exactly K workers, which gets returned.

This approach strategically uses a combination of sorting by a custom rule (wage to quality ratio) and a max priority queue to manage the group of selected workers dynamically, ensuring that the solution remains efficient and effective.

java
class Solution {

    public double minimumCostToHireWorkers(int[] quality, int[] wage, int k) {
        int numWorkers = quality.length;
        double leastCost = Double.MAX_VALUE;
        double sumQuality = 0;
        List<Pair<Double, Integer>> qualityWageRatio = new ArrayList<>();

        // Compute quality to wage ratio
        for (int i = 0; i < numWorkers; i++) {
            qualityWageRatio.add(
                new Pair<>((double) wage[i] / quality[i], quality[i])
            );
        }

        // Sorting the workers by their quality to wage ratio
        Collections.sort(
            qualityWageRatio,
            Comparator.comparingDouble(Pair::getKey)
        );

        // Priority queue to track quality of hired workers
        PriorityQueue<Integer> qualityQueue = new PriorityQueue<>(
            Collections.reverseOrder()
        );

        // Loop through all workers
        for (int i = 0; i < numWorkers; i++) {
            qualityQueue.add(qualityWageRatio.get(i).getValue());
            sumQuality += qualityWageRatio.get(i).getValue();

            // Remove worker with the highest quality if we exceed k
            if (qualityQueue.size() > k) {
                sumQuality -= qualityQueue.poll();
            }

            // Calculate the minimal possible cost for exactly k workers
            if (qualityQueue.size() == k) {
                leastCost = Math.min(
                    leastCost,
                    sumQuality * qualityWageRatio.get(i).getKey()
                );
            }
        }
        return leastCost;
    }
}

The provided Java solution addresses the problem of finding the minimum cost to hire exactly 'k' workers, where each worker has a specified wage proportional to their individual quality. The solution strategy is detailed and efficient, employing both sorting and priority queues to manage and compute the minimum cost effectively.

  • Initialize variables for storing individual and collective worker data.
  • Calculate each worker's wage to quality ratio and store this along with their quality in a list of pairs, qualityWageRatio.
  • Sort the qualityWageRatio list to prioritize workers with lower wage demands per quality point.
  • Use a PriorityQueue, qualityQueue, to maintain the highest quality values seen so far while iterating over sorted workers.
  • Maintain a running sum of qualities, sumQuality, of the selected workers.
  • In each iteration, add the worker's quality to sumQuality and update the queue to ensure only 'k' workers are considered.
  • If the queue size exceeds 'k', remove the worker with the highest quality, adjusting sumQuality accordingly.
  • Calculate and update the least possible cost whenever exactly 'k' workers are hired, using the product of the current worker’s wage-quality ratio and sumQuality.
  • Finally, return the computed leastCost.

Review each logical section carefully to ensure correct operation. Test the function with diverse scenarios to validate performance and correctness. The solution's use of sorting followed by a min-max approach utilizing a priority queue ensures that the computation is both correct and efficient.

python
class Solution:
    def calculateMinCost(self, quality: List[int], wage: List[int], k: int) -> float:
        worker_count = len(quality)
        min_cost = float('inf')
        total_quality_sum = 0
        ratio_quality = []

        # Compute the ratio of wage to quality and also track quality
        for i in range(worker_count):
            ratio_quality.append((wage[i] / quality[i], quality[i]))

        # Sort based on the computed ratio to optimize cost
        ratio_quality.sort(key=lambda x: x[0])

        # Use a max heap to manage the quality of selected workers
        max_quality_heap = []

        # Process sorted workers by their efficiency ratio
        for i in range(worker_count):
            heapq.heappush(max_quality_heap, -ratio_quality[i][1])
            total_quality_sum += ratio_quality[i][1]

            # Ensure we only consider k workers by removing the highest quality if exceeding k
            if len(max_quality_heap) > k:
                total_quality_sum += heapq.heappop(max_quality_heap)

            # When we have exactly k workers, compute the potential minimum cost
            if len(max_quality_heap) == k:
                min_cost = min(
                    min_cost,
                    total_quality_sum * ratio_quality[i][0],
                )

        return min_cost

The provided Python script aims to solve a problem where you must determine the minimum cost to hire exactly k workers out of a list, based on individual worker's quality and their minimum wage demands. Each worker has a specific quality and wage ratio, and the goal is to hire workers in such a way that the ratio remains consistent, thereby minimizing the overall cost of the wages.

Here's a concise breakdown of the solution approach:

  • Initialize essential variables: the total number of workers, a list to store the ratio of wage to quality along with the quality, a variable to keep track of the minimum cost initialized to infinity, a variable for summing total quality, and a max heap to manage the quality of selected workers.

  • First, compute the wage to quality ratio for each worker and store both the ratio and the quality in a list. This list is then sorted based on the wage-quality ratio. This sorting is to ensure when selecting workers for a minimal cost calculation, it's optimized based on the most cost-effective choice.

  • Iteratively process each worker by their sorted wage-quality ratio:

    • Use a max heap to manage the quality of current selected workers, pushing the negative of their quality to simulate max heap since Python's heapq implements a min heap by default.
    • Maintain a counter for the total quality sum of selected workers.
    • If the selected workers exceed k, the worker with the highest quality is removed to keep the team size within k.
    • Compute the hiring cost when exactly k workers are selected by multiplying the current total quality sum with the worker's wage-quality ratio who has been processed i.e., the latest worker in the sorted list. This cost is then compared with the previously stored minimum cost and updated if lower.
  • The function returns the computed minimal hiring cost once all workers are processed.

This method effectively minimizes the hiring cost by focusing on the lowest wage relative to quality while maintaining the required team size. Through a combination of sorting and heap operations, the solution efficiently handles worker selection constraints and optimizes cost calculations.

Comments

No comments yet.