1+ class Solution {
2+ public double maxAverageRatio (int [][] classes , int extraStudents ) {
3+ int n = classes .length ;
4+
5+ // Priority queue to act as a max-heap, storing pairs of {max-delta, index}
6+ PriorityQueue <double []> pq = new PriorityQueue <>((a , b ) -> Double .compare (b [0 ], a [0 ]));
7+
8+ // Initialize the priority queue with the delta values and indices
9+ for (int i = 0 ; i < n ; i ++) {
10+ double currentPR = (double ) classes [i ][0 ] / classes [i ][1 ];
11+ double newPR = (double ) (classes [i ][0 ] + 1 ) / (classes [i ][1 ] + 1 );
12+ double delta = newPR - currentPR ;
13+ pq .offer (new double []{delta , i });
14+ }
15+
16+ // Allocate extra students
17+ while (extraStudents -- > 0 ) {
18+ // Extract the class with the maximum delta
19+ double [] current = pq .poll ();
20+ int index = (int ) current [1 ];
21+
22+ // Update the class with an extra student
23+ classes [index ][0 ]++;
24+ classes [index ][1 ]++;
25+
26+ // Recalculate the delta for this class
27+ double currentPR = (double ) classes [index ][0 ] / classes [index ][1 ];
28+ double newPR = (double ) (classes [index ][0 ] + 1 ) / (classes [index ][1 ] + 1 );
29+ double delta = newPR - currentPR ;
30+
31+ // Push the updated delta and index back into the priority queue
32+ pq .offer (new double []{delta , index });
33+ }
34+
35+ // Calculate the final average pass ratio
36+ double result = 0.0 ;
37+ for (int i = 0 ; i < n ; i ++) {
38+ result += (double ) classes [i ][0 ] / classes [i ][1 ];
39+ }
40+ return result / n ;
41+ }
42+ }
0 commit comments