Maximum Average Pass Ratio

MediumArrayGreedyHeap (Priority Queue)

Solution

import { Heap } from '@algorithm/lib';
 
export function maxAverageRatio(classes: number[][], extraStudents: number): number {
  const n = classes.length;
  const heap = new Heap<number[]>(sortByRatioDiff);
  for (const [pass, total] of classes) {
    heap.push([pass, total]);
  }
 
  for (let i = 0; i < extraStudents; i++) {
    const [pass, total] = heap.pop()!;
    heap.push([pass + 1, total + 1]);
  }
 
  let totalPassRatio = 0;
  while (!heap.isEmpty) {
    const [pass, total] = heap.pop()!;
    totalPassRatio += pass / total;
  }
  return totalPassRatio / n;
}
 
function sortByRatioDiff([pass1, total1]: number[], [pass2, total2]: number[]) {
  const ratioDiff1 = (pass1 + 1) / (total1 + 1) - pass1 / total1;
  const ratioDiff2 = (pass2 + 1) / (total2 + 1) - pass2 / total2;
  return ratioDiff2 - ratioDiff1;
}

Complexity

  • Time: O(extraStudentslogn)O(extraStudents \cdot logn)
  • Space: O(n)O(n)