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

파이썬의 세포 융합


셀이라고 하는 숫자 목록이 있다고 가정합니다. 이 목록은 다른 셀의 크기를 나타냅니다. 이제 각 반복에서 두 개의 가장 큰 셀과 b는 다음 규칙에 따라 상호 작용합니다. 따라서 =b이면 둘 다 죽습니다. 그렇지 않으면 두 셀이 병합되고 크기가 ((a + b) / 3)의 바닥이 됩니다. 마지막 셀의 크기를 찾거나 남은 셀이 없으면 -1을 반환해야 합니다.

따라서 입력이 [20,40,40,30]과 같으면 출력은 16이 되고 첫 번째 반복에서는 40과 40이 죽고 20과 30은 ((20+30) / 3)의 바닥이 됩니다. =50/3의 바닥 =16

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

  • cells :=셀 배열의 각 값을 음수로 변환

  • 셀로 힙 만들기

  • 셀이 비어 있지 않은 동안 수행 -

    • 셀에서 두 요소를 삭제하고 다시 음수로 변환하고 연속적으로 첫 번째와 두 번째로 할당

  • 첫 번째가 두 번째와 같지 않으면 -

    • (첫 번째 + 두 번째)/3) 바닥의 음수를 힙에 삽입

  • 셀에 일부 요소가 있으면 음수 반환 [0] 그렇지 않으면 1

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

예시

from heapq import heapify, heappop, heappush
class Solution:
   def solve(self, cells):
      cells=[-x for x in cells]
      heapify(cells)
      while len(cells)>1:
         first,second = -heappop(cells), -heappop(cells)
         if first!=second:
            heappush(cells, -((first+second)//3))
      return -cells[0] if cells else -1
ob = Solution()
cells = [20,40,40,30]
print(ob.solve(cells))

입력

[20,40,40,30]

출력

16