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

ค้นหาเวลาขั้นต่ำเพื่อทำงานทั้งหมดให้เสร็จด้วยข้อจำกัดที่กำหนดใน Python


สมมติว่าเรามีงานจำนวนมากที่มีความต้องการด้านเวลาต่างกัน มีบุคคล k คนที่จะมอบหมายงานและเรามีเวลาเท่าใดที่ผู้ได้รับมอบหมายใช้ในการทำงานหน่วยเดียว เราต้องหาเวลาขั้นต่ำในการทำงานทั้งหมดให้เสร็จสิ้นโดยมีข้อจำกัดดังต่อไปนี้

  • มอบหมายได้เฉพาะงานที่ต่อเนื่องกันเท่านั้น

  • ผู้ได้รับมอบหมายสองคนไม่สามารถแบ่งปันหรือทำงานเดียวได้

ดังนั้น หากอินพุตเป็น k =4, t =5, job ={12, 6, 9, 15, 5, 9} ผลลัพธ์จะเป็น 75 ตามที่เราได้รับในครั้งนี้โดยกำหนด [12],[6 , 9],[15] และ [5, 9]

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

  • กำหนดฟังก์ชัน is_valid() ต้องใช้เวลาครับ K งาน

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

  • จำนวน :=1, curr_time :=0, i :=0

  • ในขณะที่ฉัน

    • ถ้าcurr_time + job[i]> เวลา แล้ว

      • curr_time :=0

      • นับ :=นับ + 1

    • มิฉะนั้น

      • curr_time :=curr_time + job[i]

      • ผม :=ผม + 1

  • คืนค่าจริงเมื่อนับ <=K

  • จากวิธีหลัก ให้ทำดังนี้

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

  • สิ้นสุด :=0, เริ่มต้น :=0

  • สำหรับผมอยู่ในช่วง 0 ถึง n ทำ

    • end :=end + job[i]

  • res :=จบ

  • job_max :=จำนวนงานสูงสุด

  • ขณะที่เริ่ม <=สิ้นสุด ทำ

    • mid :=((begin + end) / 2) นำจำนวนเต็ม

    • ถ้า mid>=job_max และ is_valid(mid, K, job) เป็นจริง แล้ว

      • res :=ความละเอียดขั้นต่ำ, กลาง

      • end :=mid - 1

    • มิฉะนั้น

      • เริ่มต้น :=กลาง + 1

  • ผลตอบแทน * T

ตัวอย่าง

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

def is_valid(time, K, job):
   n = len(job)
   count = 1
   curr_time = 0
   i = 0
   while i < n:
      if curr_time + job[i] > time:
         curr_time = 0
         count += 1
      else:
         curr_time += job[i]
         i += 1
   return count <= K
def get_minimum_time(K, T, job):
   n = len(job)
   end = 0
   begin = 0
   for i in range(n):
      end += job[i]
   res = end
   job_max = max(job)
   while begin <= end:
      mid = int((begin + end) / 2)
      if mid >= job_max and is_valid(mid, K, job):
         res = min(res, mid)
         end = mid - 1
      else:
         begin = mid + 1
   return res * T
job = [12, 6, 9, 15, 5, 9]
k = 4
T = 5
print(get_minimum_time(k, T, job))

อินพุต

4, 5, [12, 6, 9, 15, 5, 9]

ผลลัพธ์

75