static int FindBestDistribution(int totalHospitalCount, int[] populations)
if (totalHospitalCount < populations.Length) {
int[] hospitals = new int[populations.Length];
float[] densities = Array.ConvertAll(populations, element => (float)element);
for (int i = 0; i < hospitals.Length; i++) {
totalHospitalCount -= hospitals.Length;
while (totalHospitalCount > 0) {
int idx = GetMaxDensityIndex(densities);
int hospitalCount = hospitals[idx] + 1;
hospitals[idx] = hospitalCount;
densities[idx] = (float)populations[idx] / hospitalCount;
return (int)Math.Ceiling(densities[GetMaxDensityIndex(densities)]);
static int GetMaxDensityIndex(float[] densities)
float maxValue = float.MinValue;
for (int i = 0; i < densities.Length; i++) {
if (densities[i] > maxValue) {
private static int _count = 1;
static void runCase(int hospitalCount, int[] populations, int expectedMinimum)
int actualMinimum = FindBestDistribution(hospitalCount, populations);
if (expectedMinimum == actualMinimum) {
Console.WriteLine("{0}: Success!", _count);
Console.WriteLine("{0}: Failure! {1} != {2}", _count, expectedMinimum, actualMinimum);
public static void Main(string[] args)
runCase(7, new int[] {200000, 500000}, 100000);
runCase(3, new int[] {3698173, 1435143}, 1849087);
runCase(38, new int[] {962725, 744473, 1883667, 3980182, 4566733, 2433589, 1347670, 3346447, 2831489, 272829}, 669290);
runCase(76, new int[] {2261427, 359149, 4820519, 703064, 2787085, 2822378, 1669172, 1378943, 3896068, 1359914, 4031467, 2810237, 212899, 3297550, 3266279}, 535614);