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

Python에서 정확히 k 점프에서 마지막 섬에 도달하는 데 필요한 점프의 최대 길이의 최소값 찾기


숫자 배열 A가 있다고 가정하고 A에서 i 번째 숫자는 섬이 있는 위치이고 또 다른 정수 k가 제공됩니다(1 ≤ k

따라서 입력이 A =[7, 20, 41, 48], k =2와 같은 경우 출력은 28이 됩니다. 마지막 섬 7에서 20에서 48에 도달하는 두 가지 방법이 있으므로 여기에서 최대 거리 연속된 두 섬 사이의 거리는 48에서 20 사이, 즉 28입니다. 여기에서 7에서 41에서 48까지 연속된 두 섬 사이의 최대 거리는 41에서 7, 즉 34입니다. 따라서 28과 34의 최소값은 28입니다.

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

  • isPossible() 함수를 정의합니다. arr,dist,k

    가 필요합니다.
  • n :=arr의 크기

  • 요구:=0

  • 현재 :=0

  • 이전 :=0

  • 0에서 n 사이의 i에 대해 수행

    • 현재는 n과 같지 않으며 (arr[current] - arr[이전]) <=dist, do

      • 현재 :=현재 + 1

    • 요구 사항 :=요구 사항 + 1

    • 전류가 n과 같으면

      • 루프에서 나오다

    • 이전 :=현재 - 1

  • 전류가 n과 같지 않으면

    • 거짓을 반환

  • req <=k이면

    • 참을 반환

  • 거짓을 반환

  • 기본 방법에서 다음을 수행하십시오 -

  • n :=arr의 크기

  • 왼쪽 :=0

  • right :=arr의 마지막 요소

  • 답변 :=0

  • 동안 왼쪽 -=오른쪽, 수행

    • 중간 :=(왼쪽 + 오른쪽) / 2;

    • isPossible(arr, mid, k)이 0이 아니면

      • as :=중간

      • 오른쪽 :=중간 - 1

    • 그렇지 않으면

      • 왼쪽 :=중간 + 1

  • 반환

예시

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

def isPossible(arr,dist, k) :
   n = len(arr)
   req = 0
   current = 0
   previous = 0
   for i in range(0, n):
      while (current != n and (arr[current] - arr[previous]) <= dist):
         current += 1
      req += 1
      if (current == n):
         break
      previous = current - 1
   if (current != n):
      return False
   if (req <= k):
      return True
   return False
def minimum_distance(arr, k):
   n = len(arr)
   left = 0
   right = arr[-1]
   ans = 0
   while (left <= right):
      mid = (left + right) // 2;
      if (isPossible(arr, mid, k)):
         ans = mid
         right = mid - 1
      else:
         left = mid + 1
   return ans
arr = [7, 20, 41, 48]
k = 2
print(minimum_distance(arr, k))

입력

[7, 20, 41, 48] , 2

출력

28