Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 k 노동자를 고용하는 최소 비용을 찾는 프로그램

<시간/>

각 작업자에 대해 quality라는 배열이 있고 임금이라는 또 다른 배열이 있고 값 K가 있다고 가정합니다. i 번째 작업자는 품질[i]과 최저 임금 기대 임금[i]을 가지고 있습니다. 유료 그룹을 구성할 K명의 직원을 고용하고 싶습니다. K 직원 그룹을 고용할 때 다음 규칙에 따라 급여를 지급해야 합니다.

  • 유급 그룹의 각 근로자는 유급 그룹의 다른 직원과 비교하여 품질의 비율로 급여를 받아야 합니다.

  • 유급 그룹의 모든 근로자는 최소 기대 임금 이상을 받아야 합니다.

위의 조건을 만족하는 유료 그룹을 구성하는 데 필요한 최소 금액을 찾아야 합니다.

따라서 입력이 품질 =[10,22,5], 임금 =[70,52,30] 및 K =2와 같으면 첫 번째 작업자에게 70을 지불하고 작업자에게 35를 지불하므로 생산량은 105.000이 됩니다. 세 번째 작업자입니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • qr :=새 목록

  • 품질과 임금에서 각 쌍(q, w)에 대해 수행

    • qr 끝에 (w/q, q) 삽입

  • 목록 정렬 qr

  • cand :=새 목록, csum :=0

  • 범위 0에서 K - 1에 있는 i에 대해 수행

    • -qr[i, 1]을 힙 캔드에 삽입

    • csum :=csum + qr[i, 1]

  • ans :=csum * qr[K - 1, 0]

  • 범위 K에서 품질 크기까지의 idx에 대해

    • -qr[i, 1]을 힙 캔드에 삽입

    • csum :=csum + qr[idx, 1] + 힙 cand의 최상위 요소 및 힙에서 삭제

    • ans =ans의 최소값 및 (csum * qr[idx][0])

  • 반환

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다.

import heapq
def solve(quality, wage, K):
   qr = []
   for q, w in zip(quality, wage):
      qr.append([w/q, q])
   qr.sort()

   cand, csum = [], 0
   for i in range(K):
      heapq.heappush(cand, -qr[i][1])
      csum += qr[i][1]
   ans = csum * qr[K - 1][0]

   for idx in range(K, len(quality)):
      heapq.heappush(cand, -qr[idx][1])
      csum += qr[idx][1] + heapq.heappop(cand)
      ans = min(ans, csum * qr[idx][0])
   return ans

quality = [10,22,5]
wage = [70,52,30]
K = 2
print(solve(quality, wage, K))

입력

[10,22,5], [70,52,30], 2

출력

105