public int DeterminMaxVaccinationsInLargestClinic(int numberOfCities, int numberOfClinics, int[] cityPopulations) { int retVal = 0; bool areInputsValid = true; int usedClinics = 0; IList <CityClinicDetails> cityClinicData = new List <CityClinicDetails>(); this.OutputLogger.WriteMessage("*******************"); this.OutputLogger.WriteMessage("Number of cities: " + numberOfCities); this.OutputLogger.WriteMessage("Number of clinics: " + numberOfClinics); if (this.AreCitiesAndClinicsValid(numberOfCities, numberOfClinics) == true) { for (int i = 0; i < numberOfCities; i++) { CityClinicDetails newItem = new CityClinicDetails(i, cityPopulations[i]); if (newItem.IsPopulationValid()) { this.OutputLogger.WriteMessage("The population of city " + i + " is valid."); newItem.AddClinic(); usedClinics++; cityClinicData.Add(newItem); } else { this.OutputLogger.WriteMessage("The population of city " + i + " is NOT valid."); areInputsValid = false; break; } } } if (areInputsValid) { cityClinicData = cityClinicData.OrderByDescending(o => o.MaxVaccinationsPerClinic).ToList(); this.OutputLogger.WriteMessage("Starting point: " + CityClinicDetails.ConvertListToString(cityClinicData)); while (numberOfClinics - usedClinics > 0) { cityClinicData[0].AddClinic(); usedClinics++; cityClinicData = cityClinicData.OrderByDescending(o => o.MaxVaccinationsPerClinic).ToList(); this.OutputLogger.WriteMessage("Updated order: " + CityClinicDetails.ConvertListToString(cityClinicData)); } retVal = cityClinicData[0].MaxVaccinationsPerClinic; this.OutputLogger.WriteMessage("Return value of Max Vaccinations per clinic: " + retVal); } return(retVal); }
// I didn't like all the sorts of the original method, so I wanted to try // to come up with somethig more algorithmic. Still not quite sure // about this method, there are some rounding situations to consider // in the percentage calculations at the end, but it comes up with the right answer. public int DeterminMaxVaccinationsInLargestClinic_Alt(int numberOfCities, int numberOfClinics, int[] cityPopulations) { int totalPopulation = 0; int retVal = 0; bool areInputsValid = true; int usedClinics = 0; IList <CityClinicDetails> cityClinicData = new List <CityClinicDetails>(); if (this.AreCitiesAndClinicsValid(numberOfCities, numberOfClinics) == true) { for (int i = 0; i < numberOfCities; i++) { CityClinicDetails newItem = new CityClinicDetails(i, cityPopulations[i]); if (newItem.IsPopulationValid()) { this.OutputLogger.WriteMessage("The population of city " + i + " is valid."); newItem.AddClinic(); usedClinics++; cityClinicData.Add(newItem); } else { this.OutputLogger.WriteMessage("The population of city " + i + " is NOT valid."); areInputsValid = false; break; } totalPopulation += cityPopulations[i]; } } else { areInputsValid = false; } if (areInputsValid == true) { double evenClinicDistribution = numberOfClinics / numberOfCities; for (int i = 0; i < numberOfCities; i++) { if (usedClinics < numberOfClinics) { double cityPercentage = ((double)cityPopulations[i]) / ((double)totalPopulation); double potentialClinics = cityPercentage * numberOfClinics; // if percentage is < 1, then don't bother as the city has to have at least one // and we don't need to add any more (1 was added by default). if (potentialClinics > 1.0) { // subtract 1 because all the cities alreay have at least one. for (int j = 0; j < potentialClinics - 1; j++) { cityClinicData[i].AddClinic(); usedClinics++; } } } } } cityClinicData = cityClinicData.OrderByDescending(o => o.MaxVaccinationsPerClinic).ToList(); this.OutputLogger.WriteMessage("Updated order: " + CityClinicDetails.ConvertListToString(cityClinicData)); retVal = cityClinicData[0].MaxVaccinationsPerClinic; this.OutputLogger.WriteMessage("Return value of Max Vaccinations per clinic: " + retVal); return(retVal); }