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

โปรแกรมหารัศมีขั้นต่ำเพื่อส่องสว่างบ้านทุกหลังบนถนนใน Python


สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums ซึ่งแสดงถึงตำแหน่งของบ้านบนเส้น 1 มิติ ตอนนี้ให้พิจารณาว่าเรามีไฟถนน 3 ดวงที่เราสามารถติดไว้ที่ใดก็ได้บนเส้น และไฟที่ตำแหน่ง x จะส่องสว่างบ้านทุกหลังในระยะ [x - r, x + r] รวมอยู่ด้วย เราต้องหา r ที่เล็กที่สุดที่จำเป็นในการส่องสว่างบ้านทุกหลัง

ดังนั้นหากอินพุตมีค่าเท่ากับ nums =[4,5,6,7] เอาต์พุตจะเป็น 0.5 เนื่องจากเราสามารถวางหลอดไฟไว้ที่ 4.5, 5.5 และ 6.5 ดังนั้น r =0.5 ดังนั้นไฟสามดวงนี้จึงสามารถส่องสว่างบ้านทั้ง 4 หลังได้

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

  • กำหนดฟังก์ชัน valid() นี่จะใช้เวลา r

  • last_location :=nums[0] + r

  • นับ :=1

  • สำหรับฉันในช่วง 0 ถึงขนาดของ nums ทำ

    • val :=nums[i]

    • ถ้า val - last_location> r แล้ว

      • นับ :=นับ + 1

      • last_location :=val + r

  • คืนค่า จริง เมื่อนับ <=3 มิฉะนั้น เท็จ

  • จากวิธีหลักให้ทำดังต่อไปนี้ -

  • เรียงเลขรายการ

  • ซ้าย :=0

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

  • res :=inf

  • itr :=0

  • ในขณะที่ซ้าย <=ขวาและมัน <20 ทำ

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

    • ถ้า valid(mid) เป็นจริง แล้ว

      • res :=ความละเอียดขั้นต่ำและกลาง

      • ขวา :=กลาง

    • มิฉะนั้น

      • ซ้าย :=กลาง

      • itr :=itr + 1

  • ผลตอบแทน

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

class Solution:
   def solve(self, nums):
      def valid(r):
         last_location = nums[0] + r
         count = 1
         for i in range(len(nums)):
            val = nums[i]
            if val - last_location > r:
               count += 1
               last_location = val + r
         return count <= 3
      nums.sort()
      left = 0
      right = nums[-1]
      res = float("inf")
      itr = 0
      while left <= right and itr < 20:
         mid = left + (right - left) / 2
         if valid(mid):
            res = min(res, mid)
            right = mid
         else:
            left = mid
         itr += 1
      return res
ob = Solution()
nums = [4,5,6,7]
print(ob.solve(nums))

อินพุต

[4,5,6,7]

ผลลัพธ์

0.5