Files
coding-practice/problems/1792-maximum-average-pass-ratio/csharp/Program.cs

131 lines
3.5 KiB
C#

// LeetCode 1792: Maximum Average Pass Ratio
// 難度: Medium
// 日期: 2025-09-01
using System;
using System.Collections.Generic;
using System.Linq;
public class Solution {
public double MaxAverageRatioByBruteForce(int[][] classes, int extraStudents)
{
var n = classes.Length;
var pass = new int[n];
var total = new int[n];
for (var i = 0; i < n; i++)
{
pass[i] = classes[i][0];
total[i] = classes[i][1];
}
for (int student = 0; student < extraStudents; student++)
{
int bestClass = -1;
double maxInprovement = 0;
for (int i = 0; i < n; i++)
{
double currentAvg = CalculateAvergaeRatio(pass, total);
pass[i]++;
total[i]++;
double newAvg = CalculateAvergaeRatio(pass, total);
double improvement = newAvg - currentAvg;
pass[i]--;
total[i]--;
if (improvement > maxInprovement)
{
maxInprovement = improvement;
bestClass = i;
}
}
if (bestClass != -1)
{
pass[bestClass]++;
total[bestClass]++;
}
}
return CalculateAvergaeRatio(pass, total);
}
private double CalculateAvergaeRatio(int[] pass, int[] total) {
double sum = 0;
for (var i = 0; i < pass.Length; i++)
{
sum += (double)pass[i] / total[i];
}
return sum / pass.Length;
}
}
// 測試程式
public class Program
{
public static void Main()
{
Solution solution = new Solution();
// TestCase
TestCase1(solution);
TestCase2(solution);
}
static void TestCase1(Solution solution)
{
// Input:
int[][] classes = new int[][]
{
new int[] {1, 2},
new int[] {3, 5},
new int[] {2, 2}
};
int extraStudents = 2;
Console.WriteLine("Test 1: ");
Console.WriteLine($"classes: [{string.Join("], [", classes.Select(c => string.Join(", ", c)))}]");
Console.WriteLine($"extraStudents: {extraStudents}");
// Expected:
Console.WriteLine("Expect: ");
Console.WriteLine($"output: 0.78333");
// Actual:
Console.WriteLine("Actual: ");
Console.WriteLine($"Brute Force: {solution.MaxAverageRatioByBruteForce(classes, extraStudents):F6}");
//Console.WriteLine($"output: {solution.MaxAverageRatio(classes, extraStudents):F6}");
}
static void TestCase2(Solution solution)
{
// Input:
int[][] classes = new int[][]
{
new int[] {2, 4},
new int[] {3, 9},
new int[] {4, 5},
new int[] {2, 10}
};
int extraStudents = 4;
Console.WriteLine("Test 2: ");
Console.WriteLine($"classes: [{string.Join("], [", classes.Select(c => string.Join(", ", c)))}]");
Console.WriteLine($"extraStudents: {extraStudents}");
// Expected:
Console.WriteLine("Expect: ");
Console.WriteLine($"output: 0.53485");
// Actual:
Console.WriteLine("Actual: ");
Console.WriteLine($"Brute Force: {solution.MaxAverageRatioByBruteForce(classes, extraStudents):F6}");
//Console.WriteLine($"output: {solution.MaxAverageRatio(classes, extraStudents):F6}");
}
}