Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ค้นหาความยาวขั้นต่ำของการกระโดดขั้นต่ำที่ต้องใช้เพื่อไปให้ถึงเกาะสุดท้ายด้วยการกระโดด k ครั้งใน Python


สมมติว่าเรามีอาร์เรย์ A ของตัวเลข ใน A หมายเลข i-th คือตำแหน่งที่มีเกาะอยู่ และให้จำนวนเต็ม 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 /P>

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน isPossible() นี่จะใช้เวลา arr,dist, k

  • n :=ขนาดของ arr

  • ต้องการ :=0

  • ปัจจุบัน :=0

  • ก่อนหน้า :=0

  • สำหรับผมอยู่ในช่วง 0 ถึง n ทำ

    • ในขณะที่กระแสไม่เหมือนกับ n และ (arr[current] - arr[previous]) <=dist, do

      • ปัจจุบัน :=ปัจจุบัน + 1

    • req :=req + 1

    • ถ้ากระแสเท่ากับ n แล้ว

      • ออกจากวง

    • ก่อนหน้า :=ปัจจุบัน - 1

  • ถ้ากระแสไม่เหมือนกับ n แล้ว

    • คืนค่าเท็จ

  • ถ้า req <=k แล้ว

    • คืนค่า True

  • คืนค่าเท็จ

  • จากวิธีหลัก ให้ทำดังนี้ −

  • n :=ขนาดของ arr

  • ซ้าย :=0

  • right :=องค์ประกอบสุดท้ายของ arr

  • ตอบ :=0

  • ขณะที่ซ้าย −=ขวา ทำ

    • กลาง :=(ซ้าย + ขวา) / 2;

    • ถ้า isPossible(arr, mid, k) ไม่ใช่ศูนย์ ดังนั้น

      • ตอบ :=กลาง

      • ขวา :=กลาง - 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