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

ความสามารถในการจัดส่งพัสดุภัณฑ์ภายใน D วันใน Python


สมมติว่ามีสายพานลำเลียงที่มีบรรจุภัณฑ์ที่จะจัดส่งจากท่าเรือหนึ่งไปยังอีกที่หนึ่งภายใน D วัน ที่นี่แพ็คเกจที่ i บนสายพานลำเลียงมีน้ำหนัก[i] ในแต่ละวันเราจะบรรทุกของขึ้นเรือพร้อมกับพัสดุบนสายพาน เราจะไม่บรรทุกน้ำหนักเกินความจุน้ำหนักสูงสุดของเรือ เราต้องหาความจุน้ำหนักน้อยที่สุดของเรือที่จะส่งผลให้บรรจุภัณฑ์ทั้งหมดบนสายพานลำเลียงถูกจัดส่งภายใน D วัน ดังนั้นหากอินพุตเป็น [3,2,2,4,1,4] และ D =3 เอาต์พุตจะเป็น 6 เนื่องจากความจุของเรือที่ 6 เป็นขั้นต่ำในการจัดส่งบรรจุภัณฑ์ทั้งหมดใน 3 วัน เช่น −

  • วันที่ 1:3, 2

  • วันที่ 2:2, 4

  • วันที่ 3:1, 4

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

  • กำหนดฟังก์ชันเรียกซ้ำ Solve() การดำเนินการนี้จะรับอาร์เรย์น้ำหนัก, maxWeight และอาร์เรย์ของการจัดส่ง ซึ่งจะทำหน้าที่เหมือน −

  • ดัชนี :=0

  • สำหรับฉันอยู่ในช่วง 0 ถึงความยาวของอาร์เรย์เรือรบ

    • เรือ[i] :=0

    • ในขณะที่ดัชนี <ความยาวของน้ำหนักและเรือ[i] + น้ำหนัก[ดัชนี] <=maxWeight

      • เรือ[i] :=เรือ[i] + น้ำหนัก[ดัชนี]

      • เพิ่มดัชนีขึ้น 1

  • คืนค่า จริง เมื่อ index =ความยาวของน้ำหนัก มิฉะนั้น เท็จ

  • วิธีการหลักจะทำหน้าที่เหมือน

  • ships :=อาร์เรย์ที่มีขนาดเท่ากับ D และเติมด้วย 0

  • maxWeight :=น้ำหนักสูงสุด

  • ต่ำ :=maxWeight สูง :=maxWeight + ความยาวของน้ำหนักอาร์เรย์ + 1

  • ในขณะที่ต่ำ <สูง

    • กลาง :=ต่ำ + (สูง - ต่ำ)/2

    • ถ้าแก้(น้ำหนัก กลาง เรือรบ) เป็นจริง แล้วสูง :=กลาง หรือต่ำ :=กลาง + 1

  • ผลตอบแทนสูง

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

ตัวอย่าง

class Solution(object):
   def shipWithinDays(self, weights, D):
      ships = [0 for i in range(D)]
      max_w = max(weights)
      low = max_w
      high = max_w * len(weights)+1
      while low<high:
         mid = low + (high-low)//2
         if self.solve(weights,mid,ships):
            high = mid
         else:
            low = mid+1
      return high
   def solve(self,weights,max_w,ships):
      index = 0
      for i in range(len(ships)):
         ships[i] = 0
         while index < len(weights) and ships[i]+weights[index]<= max_w:
            ships[i] += weights[index]
            index+=1
      return index == len(weights)
ob = Solution()
print(ob.shipWithinDays([3,2,2,4,1,4],3))

อินพุต

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

ผลลัพธ์

6