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

โปรแกรมหาอัตราการขจัดหินใน K ชั่วโมงใน Python


สมมติว่าเรามีรายการของตัวเลขที่เรียกว่ากองและค่า k กอง[i] หมายถึง จำนวนของก้อนหินบนกอง i. ในแต่ละชั่วโมง เราเลือกกองและนำหินจำนวน r ออกจากกองนั้น ถ้าเราเลือกกองที่มีหินน้อยกว่า r ก็ยังต้องใช้เวลาหนึ่งชั่วโมงในการกำจัดกอง เราต้องหาค่าต่ำสุดของ r เพื่อให้เราสามารถเอาหินทั้งหมดออกในเวลาน้อยกว่าหรือเท่ากับ k ชั่วโมง

ดังนั้น ถ้าอินพุตเป็นเหมือนกอง =[3, 6, 4] k =5 แล้วผลลัพธ์จะเป็น 3 เพราะสำหรับ r =3 ก้อนหินต่อชั่วโมง เราสามารถล้างกองที่สองใน 2 ชั่วโมง แล้วล้าง ที่สามใน 2 ชั่วโมง และเคลียร์กองแรกใน 1 ชั่วโมง

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

  • l :=1
  • h :=จำนวนสูงสุด
  • r :=h
  • กำหนดฟังก์ชัน turns() นี่จะใช้เวลา r
  • ส่งคืนผลรวมขององค์ประกอบทั้งหมดที่มีอยู่ในรายการด้วย (เพดานของ b / r สำหรับแต่ละ b ในกอง)
  • จากวิธีหลัก ให้ทำดังต่อไปนี้ −
  • ในขณะที่ l
  • กลาง :=ชั้นของ (l + h) / 2
  • ถ้าเลี้ยว(กลาง)> k แล้ว
    • l :=กลาง + 1
  • มิฉะนั้น
    • h :=กลาง
    • r :=ขั้นต่ำของ r และ mid
  • คืนสินค้า
  • ตัวอย่าง

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

    from math import ceil
    def solve(piles, k):
       l = 1
       h = max(piles)
       r = h
    
       def turns(r):
          return sum(ceil(b / r) for b in piles)
       while l < h:
          mid = (l + h) // 2
          if turns(mid) > k:
             l = mid + 1
          else:
             h = mid
             r = min(r, mid)
       return r
    
    piles = [3, 6, 4]
    k = 5
    print(solve(piles, k))

    อินพุต

    [3, 6, 4], 5

    ผลลัพธ์

    3