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

Python의 Campus Bikes II

<시간/>

캠퍼스를 나타내는 2D 그리드가 있고 N명의 작업자와 M개의 자전거가 있다고 가정합니다. 값은 N <=M입니다. 이제 각 작업자와 자전거는 이 그리드에서 2D 좌표에 있습니다. 따라서 각 작업자에게 하나의 고유한 자전거를 할당하여 각 작업자와 할당된 자전거 간의 맨해튼 거리의 합이 최소가 되도록 하려는 경우입니다.

두 점 p1과 p2 사이의 맨해튼 거리는 (p1, p2) =|p1.x - p2.x| + |p1.y - p2.y|. 우리는 각 작업자와 할당된 자전거 사이의 맨해튼 거리의 가능한 최소 합을 찾아야 합니다.

따라서 입력이 작업자 =[[0,0],[2,1]]인 경우 자전거 =[[1,2],[3,3]]

Python의 Campus Bikes II

그러면 출력은 6

이 됩니다.

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

  • 함수 도우미()를 정의합니다. 시간이 걸립니다,b

    • 반환 |a[0]-b[0]| + |a[1] - b[1]|

  • 함수 solve()를 정의합니다. 이것은 bikes,workers,bikev,i:=0이 필요합니다.

  • info :=i와 bikev가 있는 목록

  • 메모에 정보가 있는 경우

    • 회신 메모[정보]

  • i가 작업자의 크기와 같으면

    • 0 반환

  • temp :=무한대

  • 범위 0에서 자전거 크기까지의 j에 대해

    • bikev[j]가 0이 아니면

      • 바이크[j]:=1

      • temp :=최소 온도, helper(workers[i], bikes[j]) +solve(bikes, workers, bikev, i+1)

      • 바이크[j]:=0

  • 메모[정보]:=임시

  • 반환 온도

  • assignBikes() 함수를 정의합니다. 작업자, 자전거가 필요합니다.

  • bikev :=크기가 자전거 크기와 같은 목록, false로 채우십시오.

  • 메모:=새 지도

  • 반환 해결(자전거, 작업자, Bikev)

예시

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

class Solution(object):
   def helper(self,a,b):
      return abs( (a[0]-b[0]) ) + abs( (a[1] - b[1]) )
   def solve(self,bikes,workers,bikev,i=0):
      info = (i,tuple(bikev))
      if info in self.memo:
         return self.memo[info]
      if i == len(workers):
         return 0
      temp = float('inf')
      for j in range(len(bikes)):
         if not bikev[j]:
            bikev[j]=1
            temp = min(temp,self.helper(workers[i],bikes[j])+self.solve(bikes,workers,bi
kev,i+1))
            bikev[j]=0
      self.memo[info]= temp
      return temp
   def assignBikes(self, workers, bikes):
      bikev = [False for i in range(len(bikes))]
      self.memo={}
      return self.solve(bikes,workers,bikev)
ob = Solution()
print(ob.assignBikes([[0,0],[2,1]],[[1,2],[3,3]]))

입력

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

출력

6