2
public int[] assignTasks(int[] servers, int[] tasks) {4
PriorityQueue<int[]> availableServer =5
new PriorityQueue<int[]>((a, b) -> (a[1] != b[1] ? (a[1] - b[1]) : (a[0] - b[0])));6
for (int i = 0; i < servers.length; i++) {7
availableServer.add(new int[] {i, servers[i]});11
// arr[0] - server index12
// arr[1] - server weight14
PriorityQueue<int[]> processingServer =15
new PriorityQueue<int[]>(19
: // try to sort increasing order of free time22
: // try to sort increasing order of server weight23
a[0] - b[0] // sort increasing order of server index26
int[] result = new int[tasks.length];28
for (int i = 0; i < tasks.length; i++) {30
while (!processingServer.isEmpty() && processingServer.peek()[2] <= i) {31
int serverIndex = processingServer.remove()[0];32
availableServer.add(new int[] {serverIndex, servers[serverIndex]});35
int currentTaskTimeRequired = tasks[i];39
// when current task will free the server done40
int freeTime = currentTaskTimeRequired;42
if (!availableServer.isEmpty()) {43
server = availableServer.remove();46
server = processingServer.remove();47
// append previous time48
freeTime += server[2];51
int serverIndex = server[0];52
processingServer.add(new int[] {serverIndex, servers[serverIndex], freeTime});54
// assign this server to current task55
result[i] = serverIndex;