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

โปรแกรมหาจำนวนแอปเปิลสูงสุดที่กินได้ใน Python


สมมติว่าเรามีอาร์เรย์สองอาร์เรย์ชื่อ days และ apples ความยาวเท่ากัน n มีต้นแอปเปิลพิเศษที่ออกแอปเปิลทุกวันเป็นเวลา n วันติดต่อกัน ในวันที่ i ต้นไม้ออกแอปเปิล apples[i] ลูก และจะเน่าหลังจาก days[i] วัน กล่าวคือ ในวันที่ i + days[i] แอปเปิลจะเน่าและกินไม่ได้ ในบางวัน หาก apples[i] = 0 และ days[i] = 0 แสดงว่าในวันที่ i ต้นไม้ไม่ออกแอปเปิล เราสามารถกินได้สูงสุดหนึ่งลูกต่อวัน (สามารถกินต่อได้หลังจาก n วันแรก) เราต้องหาจำนวนแอปเปิลสูงสุดที่เราสามารถกินได้

เช่น ถ้าอินพุตคือ apples = [1,2,3,5,2] days = [3,2,1,4,2] ผลลัพธ์จะเป็น 7 เพราะ:

  • วันที่ 1 กินแอปเปิลที่ออกในวันแรก
  • วันที่ 2 กินแอปเปิลที่ออกในวันที่สอง
  • วันที่ 3 กินแอปเปิลที่ออกในวันที่สอง อีกครั้ง หลังวันนี้ แอปเปิลวันที่สามจะเน่า
  • วันที่ 4 ถึง 7 กินแอปเปิลที่ออกในวันที่สี่

วิธีแก้ปัญหา

  • minheap := heap ใหม่ว่างเปล่า
  • day := 0, res := 0
  • สำหรับ i ในช่วง 0 ถึงขนาดของ apples - 1:
    • day := i
    • while minheap ไม่ว่าง และค่าเน่าของ top ของ minheap < day: ลบ top ออกจาก minheap
    • nbrApple := apples[i]
    • expiration := i + days[i] - 1
    • ถ้า nbrApple > 0: แทรก (expiration, nbrApple) ลง minheap
    • ถ้า minheap ไม่ว่าง:
      • (date, apple) := top ของ minheap และลบออกจาก heap
      • res := res + 1
      • ถ้า apple > 1: แทรก (date, apple-1) ลง minheap
  • while minheap ไม่ว่าง:
    • day := day + 1
    • while minheap ไม่ว่าง และค่าเน่าของ top < day: ลบ top ออกจาก minheap
    • ถ้า minheap ว่าง: ออกจากลูป
    • (date, apple) := top ของ minheap และลบออกจาก heap
    • res := res + 1
    • ถ้า apple > 1: แทรก (date, apple-1) ลง minheap
  • return res

ตัวอย่าง

import heapq

def solve(apples, days):
    minheap = []
    heapq.heapify(minheap)
    day = 0
    res = 0
    for i in range(len(apples)):
        day = i
        while minheap and minheap[0][0] < day:
            heapq.heappop(minheap)
        nbrApple = apples[i]
        expiration = i + days[i] - 1
        if nbrApple > 0:
            heapq.heappush(minheap, (expiration, nbrApple))
        if minheap:
            date, apple = heapq.heappop(minheap)
            res += 1
            if apple > 1:
                heapq.heappush(minheap, (date, apple-1))
    while minheap:
        day += 1
        while minheap and minheap[0][0] < day:
            heapq.heappop(minheap)
        if minheap == []:
            break
        date, apple = heapq.heappop(minheap)
        res += 1
        if apple > 1:
            heapq.heappush(minheap, (date, apple-1))
    return res

apples = [1,2,3,5,2]
days = [3,2,1,4,2]
print(solve(apples, days))

อินพุต

[1,2,3,5,2],[3,2,1,4,2]

เอาต์พุต

7