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

파이썬에서 여행을 시작할 수 있는 시작점의 번호를 찾는 프로그램

<시간/>

0에서 n-1까지 번호가 지정된 n개의 도시가 있고 n개의 방향 도로가 있다고 가정합니다. 우리는 도시 i에서 도시 (i + 1) % n [0 to 1 to 2 to .... to N - 1 to 0]으로 여행할 수 있습니다. 우리는 차를 가지고 있습니다. 우리 차의 연료 탱크 용량은 캡 단위입니다. 도시 i의 시작 부분에 사용할 수 있는 연료[i] 단위의 연료가 있으며 자동차는 도시 i에서 (i + 1) %n까지 이동하는 데 비용[i] 단위의 연료가 필요합니다. 모든 도시를 여행하고 출발한 동일한 도시에 도달하려면 자동차를 출발할 수 있는 곳에서 몇 개의 도시를 찾아야 할까요?

따라서 입력이 cap =3 연료 =[3,1,2] 비용 =[2,2,2]와 같으면 두 가지 가능한 솔루션이 있기 때문에 출력은 2가 됩니다.

  • 우리는 도시 0에서 시작하여 탱크에 3단위의 연료를 채우고 2단위의 연료를 사용하여 도시 1로 이동할 수 있습니다. 탱크에는 한 단위가 남아 있습니다. 도시 1에서 1단위의 연료를 취한 후 자동차는 2단위의 연료를 가지고 있으며 우리는 2단위의 연료를 사용하여 도시 2로 이동할 수 있습니다. 이제 연료 탱크가 비어 있습니다. 도시 2에서 2갤런의 연료를 보급한 후 2갤런의 연료를 사용하여 도시 0으로 돌아갑니다.

  • 우리는 도시 2에서 시작하여 2단위의 연료를 차에 채우고 도시 0으로 여행할 수 있습니다. 그런 다음 도시 0에서 3갤런의 연료를 보급한 후 도시 1로 이동하고 1단위의 연료를 갖게 됩니다. 그런 다음 도시 1에서 1단위의 연료를 보급할 수 있으며 이제 2단위의 연료를 가지고 도시 2로 이동할 수 있습니다.

그러나 우리는 도시 1에서 시작할 수 없으며 연료가 1단위만 존재하지만 도시 2로 여행하려면 2갤런이 필요합니다.

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

  • n :=연료의 크기
  • req :=크기가 n이고 0으로 채워지는 배열
  • 0 ~ 1 범위의 k에 대해
    • n-1에서 0 사이의 i에 대해 1만큼 감소, do
      • nexti :=(i + 1) 모드 n
      • req[i] :=최대값 0 및 req[nexti] + 비용[i] - 연료[i]
      • 최소값이 (req[i] + fuel[i] 및 cap) - 비용[i]
      • 0을 반환
  • r에서 0의 개수를 반환
  • 예시

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

    def solve(cap, fuel, costs):
       n = len(fuel)
       req = [0] * n
    
       for k in range(2):
          for i in range(n-1, -1, -1):
             nexti = (i + 1) % n
             req[i] = max(0, req[nexti] + costs[i] - fuel[i])
             if min(req[i] + fuel[i], cap) - costs[i] < req[nexti]:
                return 0
       return sum(1 for r in req if r == 0)
    
    cap = 3
    fuel = [3,1,2]
    costs = [2,2,2]
    print(solve(cap, fuel, costs))

    입력

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

    출력

    2