Hands

1056

ข้อนี้ให้งานมา NN (N2000)(N \leq 2000) งานโดยงานที่ ii จะใช้เวลา TiT_i และสามารถทำเป็นชุดๆ ชุดละอย่างมาก KK งาน

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

แนวคิด

โจทย์ข้อนี้เป็นโจทย์ Greedy Algorithm

เราจะสามารถพิสูจน์ว่าควรนำงานที่มีเวลามากสุดมาไว้ในชุดเดียวกัน KK งานแรก และทำเช่นนี้จนครบ NN งาน

นั่นคือหากนำค่า T1,T2,,TNT_1, T_2, \dots, T_N มาเรียงกันใหม่จากมากไปน้อยเป็น T1,T2,,TNT'_1, T'_2, \dots, T'_N ทางที่ดีที่สุคการจุดชุดเป็น (T1,T2,TK),(TK+1,TK+2T2K),(T'_1, T'_2, \dots T'_K), (T'_{K+1}, T'_{K+2} \dots T'_{2K}), \dots

แนวทางการพิสูจน์

สมมติว่าการจัดชุดที่ดีสุดคือเป็นชุด O1,O2,O_1, O_2, \dots โดยชุด Oi=(Oi,1,Oi,2,,Oi,j)O_i = (O_{i,1}, O_{i,2}, \dots, O_{i,j}) นั่นคือในชุด OiO_i มีงานที่ใช้เวลา Oi,1,Oi,2,,Oi,jO_{i,1}, O_{i,2}, \dots, O_{i,j}

เคส NKN \leq K

ถ้าเหลืองานไม่เกิน KK งานแน่นอนว่าจะเอาทุกงานมารวมในชุดเดียวกันได้

เคส N>KN > K

สังเกตว่าจะต้องมีชุดใดชุดหนึ่งที่มีงานที่ใช้เวลาสูงสุด T1T'_1 เราจึงสามารถเลือกชุดนี้ให้เป็นชุดแรก O1O_1 โดยไม่เสียนัยทั่วไป และให้ O1,1=T1O_{1,1}=T'_1

หาก O1O_1 มีน้อยกว่า KK งานสามารถสามารถย้ายงานใดๆ จากชุดอื่นมาเพิ่มใน O1O_1 โดยไม่เพิ่มเวลาเพราะ T1T'_1 ใช้นานกว่าอยู่แล้ว ดังนั้นจะสามารถเลือกให้ O1O_1 มี KK งานโดยที่เวลารวมที่ได้ไม่เพิ่มขึ้น

สมมติว่างานที่ใช้เวลารองลงมา T2T'_2 อยู่ในชุดอื่น OxO_x ที่ x1x\neq 1 จะเห็นได้ว่าสามารถสลับงาน T2T'_2 มาแทน O1,2O_{1,2} โดยที่เวลารวมที่ได้ไม่เพิ่มขึ้นเพราะ

  • เวลาที่ใช้ในชุด OxO_x จะไม่เพิ่มเพราะ O1,2O_{1,2} ที่ถูกสลับไปจะไม่เกิน T2T'_2 (T2T'_2 น้อยกว่าเพียง T1T'_1 ซึ่งเป็น O1,1O_{1,1} ไปแล้ว)
  • เวลาที่ใช้ในชุด O1O_1 จะไม่เพิ่มเพราะมี T1T'_1 อยู่แล้ว และ T2T1T'_2 \leq T'_1

ดังนั้นจะได้ว่าสามารถทำงาน T2T'_2 ในชุดแรกเสมอโดยที่เวลารวมที่ได้ไม่เพิ่มขึ้น

เราสามารถใช้เหตุผลเดียวกันมาพิสูจน์ว่างานที่ใช้เวลา T3,TKT'_3, \dots T'_K สามารถนำมาอยู่ในชุดแรกและได้ผลรวมเวลาต่ำสุด

นั่นคือชุดแรกสามารถเลือกเป็น (T1,T2,TK)(T'_1, T'_2, \dots T'_K) โดยได้วิธีจัดงานที่ได้เวลารวมน้อยสุด

เมื่อเลือกชุดแรกแล้วจะเหลืออีก NKN-K งานซึ่งสามารถใช้เหตุผลแบบเดิมในการเลือกจนครบ (T1,T2,TK),(TK+1,TK+2T2K),(T'_1, T'_2, \dots T'_K), (T'_{K+1}, T'_{K+2} \dots T'_{2K}), \dots

Solution

เมื่อเรารู้แล้วว่าควรนำงานที่ใช้เวลามากสุดมาทำก่อนทีละ KK งานจนหมด เราจะสามารถแก้ข้อนี้โดย Sort งานก่อน สังเกตว่างานที่มีค่ามากสุดในแต่ละชุดจะเป็น T1,TK+1,T2K+1,T'_1, T'_{K+1}, T'_{2K+1},\dots เพราะนั่นเป็นงานที่ใช้เวลามากสุดในชุดนั้นๆ เราจึงเพียงต้องนำค่าดังกล่าวมาบวกกัน

การ Sort ใช้เวลา O(NlogN)\mathcal{O}(N\log N) และขั้นตอนอื่นๆ ใช้เวลา O(N)\mathcal{O}(N) ดังนั้นข้อนี้จะใช้เวลาทั้งหมด O(NlogN)\mathcal{O}(N\log N)