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

Python에서 작업자에게 동전을 배포할 수 있는 방법의 수를 계산하는 프로그램

<시간/>

동전과 급여라고 하는 두 개의 양수 목록이 있다고 가정합니다. 여기서 코인[i]은 코인 i의 가치를 나타내고, 급여[j]는 근로자 j에게 지불해야 하는 최소 급여 금액을 나타냅니다. 이제 유형당 하나의 동전이 있고 각 작업자에게 정확히 하나의 동전을 주어야 한다고 가정하고 각 작업자에게 동전을 주는 방법의 수를 계산해야 합니다. 여기서 어떤 작업자가 한 가지 방법으로 한 가지 유형의 동전을 받고 다른 방법으로 다른 유형의 동전을 받는 경우 두 가지 방법이 다릅니다. 결과가 매우 크면 결과 모드 10^9+7을 반환합니다.

따라서 입력이 동전 =[1, 2, 3], 급여 =[1, 2]인 경우 출력은 4가 됩니다. 마치 첫 번째 동전(값 1)을 사용하지 않는 것처럼 두 동전 모두 두 근로자 모두에게 유효하므로 두 가지 방법으로 근로자에게 급여를 지급할 수 있습니다. 이제 첫 번째 코인을 사용하면 첫 번째 작업자에게만 갈 수 있으며 나머지 동전 중 하나를 사용하여 두 번째 작업자에게 지불할 수 있습니다. 네 가지 방법이 있습니다.

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

  • 목록 코인 정렬 및 목록 급여 정렬
  • num_coins :=동전 크기
  • num_salaries :=급여 규모
  • dp :=새 지도
  • 급여의 각 급여에 대해 다음을 수행합니다.
    • l :=0, r :=num_coins - 1
    • idx :=num_coins
    • l <=r인 동안, do
      • m :=l +(r - l) / 2
      • 동전[m]>=급여인 경우
        • idx :=m
        • r :=m - 1
      • 그렇지 않으면
        • l :=m + 1
    • idx가 num_coins와 같으면
      • 0을 반환
    • dp[급여] :=idx
  • res :=1
  • num_salaries - 1에서 0 사이의 i에 대해 1 감소, do
    • 급여 :=급여[i]
    • idx :=dp[급여]
    • res :=res *(num_coins - idx + 1) -(num_salaries - i)
  • Return res mod 10^9+7

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

예시

class Solution:
   def solve(self, coins, salaries):
      coins.sort()
      salaries.sort()
      num_coins = len(coins)
      num_salaries = len(salaries)
      dp = {}
      for salary in salaries:
         l = 0
         r = num_coins - 1
         idx = num_coins
         while l <= r:
            m = l + (r - l) // 2
            if coins[m] >= salary:
               idx = m
               r = m - 1
            else:
               l = m + 1
         if idx == num_coins:
            return 0
         dp[salary] = idx
      res = 1
      for i in range(num_salaries - 1, -1, -1):
         salary = salaries[i]
         idx = dp[salary]
         res *= (num_coins - idx + 1) - (num_salaries - i)
      return res % (10**9+7)
ob = Solution()
coins = [1, 2, 3]
salaries = [1, 2]
print(ob.solve(coins, salaries))

입력

[1, 2, 3],[1, 2]

출력

4