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

Python에서 신선한 도넛을 얻는 최대 그룹 수를 찾는 프로그램

<시간/>

batchSize 값이 있고 groups[i]가 매장을 방문할 그룹[i] 고객 그룹이 있음을 나타내는 배열 그룹이 있다고 가정합니다. 그래서 주어진 batchSize의 배치로 도넛을 굽는 도넛 가게가 있습니다. 그러나 한 가지 규칙이 있습니다. 다음 배치의 도넛을 제공하기 전에 배치의 모든 도넛을 제공해야 합니다. 그리고 각 고객은 정확히 하나의 도넛을 받게 됩니다. 한 그룹이 가게에 들어올 때, 그 그룹의 모든 고객들은 다음 그룹에 연설하기 전에 서비스를 받아야 합니다. 한 그룹은 모두 신선한 도넛을 먹으면 행복할 수 있습니다. (즉, 그룹의 첫 번째 고객은 마지막 그룹에서 남은 도넛을 받지 않습니다.)

그룹을 재배열할 수 있고, 마지막으로 그룹을 재배열한 후 가능한 최대 행복 그룹 수를 찾아야 합니다.

따라서 입력이 batchSize =4 groups =[2,1,8,4,3]과 같으면 출력은 [8,4,2,3,1]과 같이 재정렬할 수 있으므로 먼저 4가 됩니다. 두 번째, 세 번째, 네 번째 그룹은 행복합니다. 첫 번째 그룹에는 두 개의 도넛 배치, 두 번째 그룹에는 하나의 배치를 만들고, 한 배치를 만든 다음 세 번째 그룹에, 다른 하나는 네 번째 그룹에 제공할 수 있습니다.

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

  • l :=그룹의 모든 g에 대해 (g mod batchSize)가 있는 목록

  • count :=l

    요소의 빈도를 포함하는 맵
  • g :=범위 0에서 batchSize까지의 모든 i에 대한 count[i] 목록

  • dp() 함수를 정의합니다. sm, t

  • t의 최대값이 0과 같으면

    • 0 반환

  • 답변 :=0

  • arr :=t

  • 범위 0에서 batchSize - 1까지의 k에 대해 수행

    • arr[k]가 0과 같으면

      • 다음 반복으로 이동

    • arr[k] :=arr[k] - 1

    • ans :=ans 및 dp((sm + k) mod batchSize, arr)

      의 최대값
    • arr[k] :=arr[k] + 1

  • +(sm이 0과 같으면 1, 그렇지 않으면 0을 반환)

  • 기본 메서드에서 dp(0, g)

    를 반환합니다.

더 나은 이해를 위해 다음 구현을 살펴보겠습니다.

from collections import Counter
def solve(batchSize, groups):
   l = [g % batchSize for g in groups]
   count = Counter(l)
   g = [count[i] for i in range(batchSize)]

   def dp(sm, t):
      if max(t) == 0:
         return 0

      ans, arr = 0, list(t)
      for k in range(batchSize):
         if arr[k] == 0:
            continue
         arr[k] -= 1
         ans = max(ans, dp((sm + k) % batchSize, arr))
         arr[k] += 1
      return ans + (sm == 0)

   return dp(0, g)

batchSize = 4
groups = [2,1,8,4,3]
print(solve(batchSize, groups))

입력

4, [2,1,8,4,3]

출력

4