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

โปรแกรมหาจำนวนวันขั้นต่ำในการทำช่อดอกไม้โดยใช้ Python


สมมติว่าเรามีอาร์เรย์ที่มีจำนวนเต็มเรียกว่า nums เราก็มีค่าอีกสองค่า m และ k ตอนนี้เราต้องทำช่อดอกไม้ ในการทำหนึ่งช่อเราต้องการ k ดอกไม้ที่อยู่ติดกันจากสวน ที่นี่สวนประกอบด้วยดอกไม้ที่แตกต่างกัน n ดอกไม้จะบานสะพรั่งวัน[i] แต่ละดอกสามารถใช้ได้ภายในช่อเดียวเท่านั้น เราต้องหาจำนวนวันขั้นต่ำที่ต้องรอเพื่อทำช่อมจากสวน หากเราไม่สามารถจัดช่อได้ ให้คืน -1

ดังนั้นหากอินพุตเป็นเหมือน bloomDay =[5,5,5,5,10,5,5] m =2 k =3 ผลลัพธ์จะเป็น 10 เพราะเราต้องการช่อดอกไม้ 2 (m =2) และแต่ละอันควร มี 3 ดอก

  • หลังจากวันที่ 5:[x, x, x, x, _, x, x] เราสามารถทำช่อดอกไม้จากสามดอกแรกที่บานได้ 1 ช่อ แต่ไม่สามารถทำช่ออื่นได้

  • หลังจากวันที่ 10:[x, x, x, x, x, x, x] ตอนนี้เราสามารถทำช่อดอกไม้สองช่อด้วยวิธีต่างๆ กัน

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

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

  • ถ้า m * k> n แล้ว

    • กลับ -1

  • กำหนดฟังก์ชั่นที่เป็นไปได้ () นี่จะใช้เวลา x

  • จำนวน :=0, ช่อดอกไม้ :=0

  • สำหรับแต่ละ d ใน bloomDay ทำ

    • ถ้า d <=x แล้ว

      • นับ :=นับ + 1

      • ถ้าการนับเท่ากับ k แล้ว

        • ช่อ :=ช่อ + 1

        • นับ :=0

    • มิฉะนั้น

      • นับ :=0

  • คืนค่า จริง หากช่อ>=m มิฉะนั้น เท็จ

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

  • ซ้าย :=0, ขวา :=1 + สูงสุด BloomDay

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

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

    • ถ้าเป็นไปได้ (กลาง) เป็นจริงแล้ว

      • ขวา :=กลาง

    • มิฉะนั้น

      • ซ้าย :=กลาง + 1

  • ถ้าเป็นไปได้ (ซ้าย) เป็นจริงแล้ว

    • กลับซ้าย

  • มิฉะนั้นกลับซ้าย + 1

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

ตัวอย่าง

def solve(bloomDay, m, k):
   n = len(bloomDay)
   if m * k > n:
      return -1
   def possible(x):
      count = 0
      bouquets = 0
      for d in bloomDay:
         if d <= x:
            count += 1
            if count == k:
               bouquets += 1
               count = 0
         else:
            count = 0
      return bouquets >= m
   left, right = 0, max(bloomDay) + 1
   while left < right:
      mid = (left + right)//2
      if possible(mid):
         right = mid
      else:
         left = mid + 1
   if possible(left):
      return left
   else:
      return left + 1
bloomDay = [5,5,5,5,10,5,5]
m = 2
k = 3
print(solve(bloomDay, m, k))

อินพุต

[5,5,5,5,10,5,5], 2, 3

ผลลัพธ์

10