Computer >> Máy Tính >  >> Lập trình >> Python

Tìm độ dài tối thiểu của bước nhảy cần thiết để đến hòn đảo cuối cùng trong chính xác k bước nhảy bằng Python


Giả sử chúng ta có một mảng A gồm các số, trong A, số thứ i là vị trí có một đảo và cho trước một số nguyên k khác (1 ≤ k

Vì vậy, nếu đầu vào là A =[7, 20, 41, 48], k =2, thì đầu ra sẽ là 28, vì có hai cách để đạt được đảo cuối cùng là 7 đến 20 đến 48, đây là khoảng cách tối đa giữa hai hòn đảo liên tiếp bất kỳ là từ 48 đến 20 là 28. Và từ 7 đến 41 đến 48 ở đây khoảng cách tối đa giữa hai đảo liên tiếp bất kỳ là từ 41 đến 7 là 34. Vì vậy, tối thiểu của 28 và 34 là 28.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Định nghĩa một hàm isPossible (). Điều này sẽ lấy arr, dist, k

  • n:=kích thước của arr

  • yêu cầu:=0

  • hiện tại:=0

  • trước:=0

  • đối với tôi trong phạm vi từ 0 đến n, hãy thực hiện

    • trong khi hiện tại không giống với n và (arr [hiện tại] - arr [trước]) <=dist, do

      • hiện tại:=current + 1

    • req:=req + 1

    • nếu dòng điện giống với n, thì

      • đi ra từ vòng lặp

    • trước:=hiện tại - 1

  • nếu dòng điện không giống với n, thì

    • trả về Sai

  • nếu yêu cầu <=k, thì

    • trả về True

  • trả về Sai

  • Từ phương thức chính, thực hiện như sau -

  • n:=kích thước của arr

  • trái:=0

  • right:=phần tử cuối cùng của arr

  • ans:=0

  • trong khi left - =right, thực hiện

    • giữa:=(trái + phải) / 2;

    • nếu isPossible (arr, mid, k) khác 0 thì

      • ans:=mid

      • right:=mid - 1

    • nếu không,

      • left:=mid + 1

  • trả lại ans

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

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))

Đầu vào

[7, 20, 41, 48] , 2

Đầu ra

28