Ocena użytkownikóww: ***** / 1
Nadesłany przez Tomasz Lubiński, 07 marca 2006 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
sainte_lague_m_d/sainte_lague_m_d.dpr:
program sainte_lague_m_d;
{$APPTYPE CONSOLE}
uses
SysUtils;
//
// Algorytm Sainte-Lague (zmodyfikowany)
//
// www.algortym.org
// (c)2006 Tomasz Lubinski
//
function calcNewValue(votes: Integer; mandates: Integer): Real;
begin
if mandates = 0 then
Result := (votes*1.0) / 1.4
else
Result := (votes*1.0) / (2*mandates + 1.0);
end;
var
mandates : Array [1..100] of Integer;
votes : Array [1..100] of Integer;
calcTab : Array [1..100] of Real;
max : Real;
groupCount, mandatesCount, maxInd, i, j: Integer;
begin
//get all data
writeln('Podaj liczbe partii (max.100)');
readln(groupCount);
writeln('Podaj liczbe mandatow');
readln(mandatesCount);
for i:=1 to groupCount do
begin
writeln('Podaj liczbe glosow na partie ' + IntToStr(i));
readln(votes[i]);
end;
//clear number of mandates
for i:=1 to groupCount do
mandates[i] := 0;
//calculate mandates (Sainte-Lague)
for i:=1 to groupCount do
calcTab[i] := votes[i];
for i:=1 to mandatesCount do
begin
//find max
max := -1;
maxInd := 1;
for j:=1 to groupCount do
begin
if max<calcTab[j] then
begin
max := calcTab[j];
maxInd := j;
end
end;
//give mandate for party with max
mandates[maxInd] := mandates[maxInd] + 1;
calcTab[maxInd] := calcNewValue(votes[maxInd], mandates[maxInd]);
end;
//present results
for i:=1 to groupCount do
begin
writeln('Partia ' + IntToStr(i) + ' ma ' + IntToStr(mandates[i]) + ' mandatow');
end;
readln;
end.