/// <summary> /// Извършва разпределение на основните мандати на партии и коалиции в /// един многомандатен изборен район (по чл. 21, ал. 3). /// </summary> /// <param name="region">Многомандатният изборен район, в който да /// бъдат разпределени мандатите.</param> /// <param name="hareQuota">Предварително изчислената квота на /// Хеър.</param> private void AssignBaseRegionalMandates(Region region, decimal hareQuota) { ConsoleHelper.WriteSectionCaption("Партии и коалиции, които получават мандати по чл. 21, ал. 3"); foreach (Party party in Parties.Values) { long partyVoteCount = region.GetVoteCount(party.PartyId); decimal partyQuotient = partyVoteCount / hareQuota; int baseMandateCount = (int)partyQuotient; var assignment = new MandateAssignment { RegionId = region.RegionId, PartyId = party.PartyId, BaseMandateCount = baseMandateCount, Remainder = partyQuotient - baseMandateCount, }; party.MandateAssignments.Add(assignment); region.MandateAssignments.Add(party.PartyId, assignment); ConsoleHelper.WriteObject(assignment); } }
/// <summary> /// Извършва разпределение на допълнителните мандати на партии и /// коалиции в един многомандатен изборен район (по чл. 21, ал. 5 и 6). /// </summary> /// <param name="region">Многомандатният изборен район, в който да /// бъдат разпределени мандатите.</param> private void AssignAdditionalRegionalMandates(Region region) { ConsoleHelper.WriteSectionCaption("Партии и коалиции, които получават допълнителен мандат по чл. 21, ал. 5 и 6"); int assignedMandateCount = region.GetAssignedMandateCount(); while (assignedMandateCount < region.MandateCount) { // Определят се партията/партиите с най-голям остатък, неудовлетворен с допълнителен мандат decimal maxRemainder = -1.0m; var partyIds = new List<int>(); foreach (MandateAssignment assignment in region.MandateAssignments.Values) { // Партии, които вече са получили допълнителен мандат на предишна стъпка, не участват в разпределянето if (assignment.AdditionalMandate) continue; if (assignment.Remainder > maxRemainder) { partyIds.Clear(); partyIds.Add(assignment.PartyId); maxRemainder = assignment.Remainder; } else if (assignment.Remainder == maxRemainder) partyIds.Add(assignment.PartyId); } int remainingMandateCount = region.MandateCount - assignedMandateCount; if (partyIds.Count > remainingMandateCount) { // Ако броят на определените партии е по-голям от броя на оставащите мандати // за разпределяне, то допълнтелните мандати се разпределят по ред на нарастване // поредния номер на партията или коалицията (чл. 21, ал. 6) Console.WriteLine( "Достигнат жребий при разпределяне на мандатите на партии и коалиции по чл. 21, ал. 6. Мандатите ще бъдат получени от първите {0} партии с най-малки номера.", remainingMandateCount); Console.WriteLine(); partyIds.Sort(); partyIds.RemoveRange(remainingMandateCount, partyIds.Count - remainingMandateCount); } // Определените партии получават по един допълнителен мандат и не участват в // по-нататъчното разпределение на допълнителни мандати foreach (int partyId in partyIds) { MandateAssignment assignment = region.MandateAssignments[partyId]; assignment.AdditionalMandate = true; ConsoleHelper.WriteObject(assignment); } assignedMandateCount = region.GetAssignedMandateCount(); } }