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

โปรแกรมหากำไรสูงสุดโดยการขายลูกบอลสีที่มีมูลค่าลดลงใน Python


สมมติว่าเรามีอาร์เรย์ที่เรียกว่า สินค้าคงคลัง โดยที่สินค้าคงคลัง [i] แทนจำนวนลูกบอลสี ith ที่เรามีในตอนแรก นอกจากนี้เรายังมีค่าที่เรียกว่าคำสั่งซื้อซึ่งแสดงถึงจำนวนลูกบอลทั้งหมดที่ลูกค้าต้องการ เราสามารถขายลูกบอลในลำดับใดก็ได้ ในสินค้าคงคลังของเรามีลูกบอลหลากสี ลูกค้าต้องการลูกบอลสีใดก็ได้ ตอนนี้คุณค่าของลูกบอลมีความพิเศษในธรรมชาติ มูลค่าของลูกบอลสีแต่ละลูกคือจำนวนลูกบอลสีนั้นที่เรามีในคลังของเรา ดังนั้นถ้าตอนนี้เรามีลูกบอลสีน้ำเงิน 6 ลูก ลูกค้าจะจ่าย 6 สำหรับลูกบอลสีน้ำเงินลูกแรก จากนั้นเหลือลูกบอลสีน้ำเงินเพียง 5 ลูก ดังนั้นลูกสีน้ำเงินถัดไปจึงมีค่าเท่ากับ 5 เราต้องหามูลค่ารวมสูงสุดที่เราจะได้รับหลังจากขายคำสั่งซื้อลูกบอลสี หากคำตอบมีขนาดใหญ่เกินไป ให้ส่งคืนโมดูล 10^9 + 7

ดังนั้นหากอินพุตเป็นเหมือนสินค้าคงคลัง =[5,7] คำสั่งซื้อ =6 ผลลัพธ์จะเป็น 31 เพราะเราสามารถขายลูกบอลสีแรกสองครั้งในราคา (5,4) และลูกบอลสีที่สอง 4 ครั้ง (7 ,6,5,4) ดังนั้น กำไรรวม 5+4+7+6+5+4 =31

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

  • ต่ำ :=0, สูง :=10000000

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

    • mid :=ผลหารของ (ต่ำ + สูง)/2

    • s :=0

    • สำหรับแต่ละ i ในสินค้าคงคลัง ทำ

      • ถ้าฉัน> กลาง แล้ว

        • s :=s + i - กลาง

    • ถ้า s> สั่งแล้ว

      • ต่ำ :=กลาง + 1

    • มิฉะนั้น

      • สูง :=กลาง

  • mid :=ผลหารของ (ต่ำ + สูง)/2

  • ตอบ :=0

  • สำหรับแต่ละ i ในสินค้าคงคลัง ทำ

    • ถ้าฉัน> กลาง แล้ว

      • ans :=ans + ผลหารของ (i*(i+1)/2) - ผลหารของ (mid*(mid+1)/2)

      • คำสั่ง :=คำสั่ง - i-mid

  • ans :=ans + orders * mid

  • ส่งคืน mod (10^9 + 7)

ตัวอย่าง

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

def solve(inventory, orders):
   low = 0
   high = 10000000

   while low < high:
      mid = (low+high)//2

      s = 0
      for i in inventory:
         if i > mid:
            s += i-mid

      if s > orders:
         low = mid+1
      else:
         high = mid


   mid = (low+high)//2

   ans = 0
   for i in inventory:
      if i > mid:
         ans += i*(i+1)//2 - mid*(mid+1)//2
         orders -= i-mid

   ans += orders*mid
   return ans % (10**9 + 7)

inventory = [5,7]
orders = 6
print(solve(inventory, orders))

อินพุต

[6,8,7,11,5,9], [0,0,2], [2,3,5]

ผลลัพธ์

31