# 1882. Process Tasks Using Servers ###### tags: `Leetcode` `Medium` `Priority Queue` Link: https://leetcode.com/problems/process-tasks-using-servers/ ## 思路 $O((N+M)logN)$ $O(N)$ $N$ is the length of $servers$, $M$ is the length of $tasks$ We use two heaps, one is for free servers, one is for used server. Free server heap is sorted based on $weight$ and $index$. Used server heap is sorted on $available \ time$ then $weight$ and $index$. Every time, we first pop from used heap and add to free server heap if the available time is smaller or equal to current task time. If the free server is empty, then we use the uhttps://leetcode.com/company/facebook/sed server with smallest available time. ## Code ```java= class Solution { public int[] assignTasks(int[] servers, int[] tasks) { int[] ans = new int[tasks.length]; Queue<int[]> usedServer = new PriorityQueue<>((a,b)->(a[2]==b[2]?(a[0]==b[0]?a[1]-b[1]:a[0]-b[0]):a[2]-b[2])); Queue<int[]> readyServers = new PriorityQueue<>((a,b)->(a[0]==b[0]?a[1]-b[1]:a[0]-b[0])); for(int i = 0;i < servers.length;i++){ usedServer.add(new int[]{servers[i], i, 0}); } int currTime = 0; for(int i = 0;i < tasks.length;i++){ while(!usedServer.isEmpty() && usedServer.peek()[2]<=i){ readyServers.add(usedServer.poll()); } if(readyServers.isEmpty()){ int[] currServer = usedServer.poll(); ans[i] = currServer[1]; currServer[2] += tasks[i]; usedServer.add(currServer); } else{ int[] currServer = readyServers.poll(); ans[i] = currServer[1]; currServer[2] = i+tasks[i]; usedServer.add(currServer); } } return ans; } } ```