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:
You are given:
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.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.
extraStudents
in a way that maximizes the average pass ratio across all classes.Input: classes = [[1, 2], [3, 5], [2, 2]];
extraStudents = 2;
Output: 0.78333;
Input:
classes = [[2, 4], [3, 9], [4, 5], [2, 10]]
extraStudents = 4
Output:
0.53485
Loading component...
Loading component...
Main Function is not defined.
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 Function is not required.