Understand Maximum Average Pass Ratio Problem

Problem Name: Maximum Average Pass Ratio
Problem Description:

📚 Maximum Average Pass Ratio (LeetCode Problem 1792)

A school has multiple classes of students, and each class will have a final exam. Your task is to distribute a given number of extra brilliant students across these classes to maximize the average pass ratio. Here's how it works:


Problem Description

You are given:

1. classes:

A 2D array where each entry is of the form classes[i] = [passi, totali]:

  • passi: The number of students in the class who are guaranteed to pass.
  • totali: The total number of students in the class.

2. extraStudents:

An integer representing the number of extra students you can assign to any class. These students are guaranteed to pass in the class they're assigned to.


Definitions:

  • Pass Ratio of a Class:
    The ratio of passing students to total students:
Pass Ratio=passitotali\text{Pass Ratio} = \frac{\text{passi}}{\text{totali}}
  • Average Pass Ratio Across All Classes:
    The sum of pass ratios of all classes divided by the total number of classes.
Average Pass Ratio=(passitotali)n\text{Average Pass Ratio} = \frac{\sum \left( \frac{\text{passi}}{\text{totali}} \right)}{n}
  • where 𝑛 is the total number of classes.

Goal: Distribute the extraStudents in a way that maximizes the average pass ratio across all classes.


🧪 Test Cases:

Example 1:

Input: classes = [[1, 2], [3, 5], [2, 2]];              extraStudents = 2;

Output: 0.78333;

Example 2:

Input:
classes = [[2, 4], [3, 9], [4, 5], [2, 10]]
extraStudents = 4

Output:
0.53485

✅ Constraints:

1classes.length1051 \leq \text{classes.length} \leq 10^5 classes[i].length==2\text{classes}[i].\text{length} == 2 1passitotali1051 \leq \text{passi} \leq \text{totali} \leq 10^5 1extraStudents1051 \leq \text{extraStudents} \leq 10^5
Category:
  • Greedy
Programming Language:
  • Java
Reference Link:

https://leetcode.com/problems/maximum-average-pass-ratio/description/?envType=daily-question&envId=2024-12-15

Online IDE

Scroll down for output
Java
Output:

Loading component...

Loading component...

Tracking code (View only. In case you want to track the code, click this button):
Main Function:

Main Function is not defined.

Helper Function:

INPUT : classes = [[1, 2], [3, 5], [2, 2]]; extraStudents = 2;

OUTPUT: 0.78333;

public static double maxAverageRatio(int[][] classes, int extrastudents){

PrivorityQueue<double[]> maxHeap = new PriorityQueue<>((a,b)-> Double.compare(b[0],a[0]));

for( int i = 0; i < classes.length; i++) {

double currAvg = (double) classes[i][0] / classes[i][1];

double newAvg = (double) (classes[i][0]+1) / (classes[i][1]+1);

double possibleIncrement = newAvg - currAvg;

maxHeap.offer(new double[]{possibleIncrement, idx });

}

while (extraStudents-- > 0) {

double[] top = maxHeap.poll();

int idx = (int) top[1];

classes[idx][0]++;

classes[idx][1]++;

double currAvg = (double) classes[idx][0] / classes[idx][1];

double newAvg = (double) (classes[idx][0] + 1) / (classes[idx][1] + 1);

double possibleIncrement = newAvg - currAvg;

maxHeap.offer(new double[]{possibleIncrement, idx});

}//Loop End

double finalAvg = 0.0;

for (int[] clazz : classes) {

finalAvg += (double) clazz[0] / clazz[1];

}//Loop End

return finalAvg / classes.length;

}//function end

Utility Functions and Global variables:

Utility Function is not required.