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

Python에서 모두 구매하는 최소 비용을 찾는 프로그램

<시간/>

0, 1, 2, …, N-1로 표시된 N개의 항목이 있다고 가정합니다. 그런 다음 세트라고 하는 크기 S의 2D 목록이 제공됩니다. 여기에서 가격 세트[i,2]에 대한 i번째 세트를 구매할 수 있으며, 세트[i, 0]에서 세트[i, 1] 사이의 모든 항목을 받습니다. 또한 제거라고 하는 크기 N의 목록이 있습니다. 여기서 가격 제거[i]를 위해 i번째 요소의 인스턴스 1개를 버릴 수 있습니다. 따라서 0에서 N-1까지의 모든 요소 중 하나를 정확하게 구매하기 위한 최소 비용을 찾아야 합니다. 그렇지 않으면 결과는 -1입니다.

따라서 입력이 다음과 같은 경우 세트 =[ [0, 4, 4], [0, 5, 12], [2, 6, 9], [4, 8, 10]]

제거 =[2, 5, 4, 6, 8]이면 출력은 4가 됩니다.

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

  • N :=제거 크기

  • 그래프 :=크기(N + 1) x (N + 1)에 대한 새 행렬

  • 세트의 각 s, e, w에 대해 수행

    • 그래프[s]에 [e+1, w] 추가

  • 각 i, 인덱스 i의 r 및 제거의 항목 r에 대해 수행

    • 그래프[i + 1]에 [i, r] 추가

  • pq :=새 힙

  • dist :=새 지도

  • dist[0] :=0

  • pq가 비어 있지 않은 동안 수행

    • d, e :=힙 pq에서 가장 작은 항목 제거

    • dist[e]

      • 다음 반복을 계속하십시오

    • e가 N과 같으면

      • 리턴 d

    • 그래프[e]의 각 nei, w에 대해 수행

      • d2 :=d + w

      • d2

        • dist[nei] :=d2

        • pq에 [d2, nei] 추가

  • 반환 -1

예시

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

import heapqfrom collections import defaultdictclass 솔루션:def solve(self, sets, 제거):N =len(removals) graph =[[] for _ in range(N + 1)] for s, e, w in sets:graph[s].append([e + 1, w]) for i, r in enumerate(removals):graph[i + 1].append([i, r]) pq =[[0, 0]] dist =defaultdict(lambda:float("inf")) dist[0] =0 동안 pq:d, e =heapq.heappop(pq) if dist[e]  

입력

[[0, 4, 4],[0, 5, 12],[2, 6, 9],[4, 8, 10]], [2, 5, 4, 6, 8] 

출력

4