กลับไปยังโจทย์
ปานกลาง 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

ลำดับการเสร็จของงานแบบขนาน

รันงานพร้อมกันได้ครั้งละไม่เกิน k งาน และรายงานลำดับที่งานเสร็จ

สิ่งที่คุณจะได้เรียนรู้

  • รันงานโดยจำกัดจำนวนที่ทำพร้อมกัน
  • จำลองเวลาด้วยคิวลำดับความสำคัญ
  • จัดลำดับงานที่เสร็จพร้อมกัน

โจทย์

ด้วย async/await เราเริ่มงานหลายงานให้ทำพร้อมกันได้ และมักใช้ SemaphoreSlim จำกัดจำนวนงานที่ทำพร้อมกัน

งานหมายเลข 0 ถึง n − 1 ใช้เวลา durations[i] หน่วย ที่เวลา 0 ให้เริ่มงานให้มากที่สุดเท่าที่ limit อนุญาต ตามลำดับหมายเลข เมื่อใดที่มีงานเสร็จ ให้บันทึกงานนั้น (ถ้าหลายงานเสร็จพร้อมกัน หมายเลขน้อยกว่ามาก่อน) แล้วเริ่มงานที่รออยู่ถัดไปตามลำดับหมายเลขทันทีเพื่อเติมช่องที่ว่าง

จงเขียน parallel_task_order(durations, limit)

อินพุต

durations: เวลาที่แต่ละงานใช้

limit: จำนวนงานสูงสุดที่ทำพร้อมกันได้

เอาต์พุต

คืนหมายเลขงานตามลำดับที่เสร็จ

เงื่อนไข

1 ≤ n ≤ 100,000

1 ≤ durations[i] ≤ 10^6; 1 ≤ limit ≤ n

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
limit = 2
durations = [4, 2, 3, 1]

ผลลัพธ์ที่คาดหวัง:
expected = [1, 0, 2, 3]
อินพุต:
long long limit = 2;
std::vector<long long> durations = {4, 2, 3, 1};

ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {1, 0, 2, 3};
อินพุต:
long limit = 2;
long[] durations = new long[] {4, 2, 3, 1};

ผลลัพธ์ที่คาดหวัง:
long[] expected = new long[] {1, 0, 2, 3};

คำอธิบาย

งาน 0 และ 1 เริ่ม งาน 1 เสร็จที่ 2 และงาน 2 เริ่ม (เสร็จที่ 5) งาน 0 เสร็จที่ 4 และงาน 3 เริ่ม (เสร็จที่ 5) งาน 2 และ 3 เสร็จพร้อมกัน หมายเลขน้อยกว่ามาก่อน: [1, 0, 2, 3]

ตัวอย่างที่ 2
อินพุต:
limit = 3
durations = [3, 1, 2]

ผลลัพธ์ที่คาดหวัง:
expected = [1, 2, 0]
อินพุต:
long long limit = 3;
std::vector<long long> durations = {3, 1, 2};

ผลลัพธ์ที่คาดหวัง:
std::vector<long long> expected = {1, 2, 0};
อินพุต:
long limit = 3;
long[] durations = new long[] {3, 1, 2};

ผลลัพธ์ที่คาดหวัง:
long[] expected = new long[] {1, 2, 0};

คำอธิบาย

ทุกงานทำพร้อมกันและเสร็จที่ 1, 2 และ 3: [1, 2, 0]

แนวทางการแก้

ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ

คำใบ้ 1

เรียงงานที่กำลังทำตามเวลาเสร็จ แล้วตามหมายเลข

คำใบ้ 2

แต่ละขั้นกระโดดไปเวลาเสร็จถัดไป แล้วเก็บทุกงานที่เสร็จตอนนั้น

คำใบ้ 3

เติมช่องว่างด้วยงานที่รออยู่ถัดไปตามลำดับหมายเลข

ความซับซ้อนที่คาดหวัง

เวลา O(n log limit), หน่วยความจำเพิ่ม O(limit)

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก