骨骼清奇Optimization

Catalog:
LC 857 Minimum Cost to Hire K Workers

LC 857 Minimum Cost to Hire K Workers
Our final pay out will be group ratio(wage/quality)*total quality. To minimize the total wage, we want a small ratio and small total quality. Note that the group ratio will be the max one of the expected ratio of the group.
To start with, we sort all workers with their expected ratio, and pick up K first worker. This is minimum group ratio, but the total quality associated with it may not be small enough to give us the answer. We move and pick up next worker with bigger ratio, now we have a bigger group ratio, and we will kick out one person to match group size requirement - we will remove the worker with highest quality so that we still keep K workers but now the total quality is smaller. If we happen to kick out the one we just added, that's fine, we will not update the answer as the calculated cost is greater with higher ratio while same total quality.

For every ratio, we find the minimum possible total quality of K workers.

class Solution(object):
    def mincostToHireWorkers(self, quality, wage, K):
        from fractions import Fraction
        workers = sorted((Fraction(w, q), q, w)
                         for q, w in zip(quality, wage))

        ans = float('inf')
        pool = []
        sumq = 0
        for ratio, q, w in workers:
            heapq.heappush(pool, -q)
            sumq += q

            if len(pool) > K:
                sumq += heapq.heappop(pool)

            if len(pool) == K:
                ans = min(ans, ratio * sumq)

        return float(ans)

你可能感兴趣的:(骨骼清奇Optimization)