public void Calcular(IList <InfoPartido> partidos, int curulesDisponibles) { if (curulesDisponibles < 1) { throw new ArgumentException("No hay curules suficientes para realizar el cálculo"); } int curulesAsignadas = curulesDisponibles; Dictionary <InfoPartido, decimal> dic = partidos.ToDictionary(k => k, v => v.VotosGanados * 1.0m); while (curulesAsignadas > 0) { // buscar el mayor List <KeyValuePair <InfoPartido, decimal> > m = (from itm in dic orderby itm.Value descending select itm).ToList(); // asignar curul InfoPartido partido = m[0].Key; partido.CurulesAsignadas = partido.CurulesAsignadas + 1; // decrementar indice y curules pendientes decimal cociente = partido.CurulesAsignadas == 1 ? 1.4m : ((2 * partido.CurulesAsignadas) + 1); dic[partido] = (partido.VotosGanados * 1m) / cociente; curulesAsignadas--; } }
public void Calcular(IList <InfoPartido> partidos, int curulesDisponibles) { if (curulesDisponibles < 1) { throw new ArgumentException("No hay curules suficientes para realizar el cálculo"); } int curulesAsignadas = curulesDisponibles; Dictionary <InfoPartido, decimal> dic = partidos.ToDictionary(k => k, v => v.VotosGanados * 1.0m); while (curulesAsignadas > 0) { // buscar el mayor List <KeyValuePair <InfoPartido, decimal> > m = (from itm in dic orderby itm.Value descending select itm).ToList(); // asignar curul InfoPartido partido = m[0].Key; partido.CurulesAsignadas = partido.CurulesAsignadas + 1; // decrementar indice y curules pendientes dic[partido] = (partido.VotosGanados * 1m) / ((partido.CurulesAsignadas) + 1); curulesAsignadas--; } /* * var dic = new Dictionary<int, Dictionary<InfoPartido, decimal>>(); * for (int i = 1; i <= curulesDisponibles; i++) * { * dic.Add(i, new Dictionary<InfoPartido, decimal>()); * Dictionary<InfoPartido, decimal> elem = dic[i]; * foreach (InfoPartido infoPartido in partidos) * { * decimal coeficiente = infoPartido.VotosGanados / (i * 1.0m); * elem.Add(infoPartido, coeficiente); * } * } * var q = (from i in dic * from d in i.Value * orderby d.Value descending * select new {Partido = d.Key, Peso = d.Value}).ToList(); * * int curulesAsignadas = curulesDisponibles; * foreach (var itm in q) * { * itm.Partido.CurulesAsignadas = itm.Partido.CurulesAsignadas + 1; * curulesAsignadas--; * if (curulesAsignadas <= 0) break; * } */ }
private static IList <InfoPartido> LeerPartidos() { IList <InfoPartido> result = new List <InfoPartido>(); while (true) { string partidoNombre = UtilConsola.LeerString("Nombre del partido a ingresar (vacio para salir) "); if (String.IsNullOrEmpty(partidoNombre)) { break; } int votos = UtilConsola.LeerInt("Votos ganados de este partido (max:1000000000):", 0, 1000000000); var infoPartido = new InfoPartido { Nombre = partidoNombre, VotosGanados = votos }; result.Add(infoPartido); } return(result); }
public static void Verificar(IList <InfoPartido> partidos, string nombre, int valorEsperado) { InfoPartido partido = partidos.First(p => p.Nombre == nombre); Assert.AreEqual(valorEsperado, partido.CurulesAsignadas); }