Autorské riešenie
[stiahni]

Pri riešení tejto úlohy si musíme uvedomiť, že výsledok volieb závisí od počtu hlasov jednotlivých kandidátov, resp od vzájomného vzťahu medzi nimi. Aby sme vedeli, či má niekto nadpolovičnú väčšinu alebo či voľby dopadli nerozhodne, je rozumné si počty hlasov usporiadať.

Pri usporadúvaní však nestačí hlasy len preusporiadať, musíme si pamätať aj to, komu patria. Preto pri ich presúvaní budeme presúvať aj mená kandidátov.

Na samotné usporiadanie hlasov môžeme použiť rôzne postupy. V našim prípade budeme postupovať nasledovne:

  • porovnáme prvé dva počty hlasov, ak je prvý počet menší ako druhý, vymeníme ich

  • porovnáme druhý a tretí počet hlasov, ak je druhý počet menší ako tretí, vymeníme ich.

Teraz už určite vieme, že žiaden z počtov hlasov nie je menší ako ten na treťom mieste. Niektorý počet môže byť rovnaký, ale to nie je problém.

Nakoniec porovnáme ešte počty hlasov na prvom a druhom mieste. Uvedomme si, že tu už môžu byť iné počty ako na začiatku.

  • Ak je prvý počet menší ako druhý, vymeníme ich.

Nezabudnime, že tak ako vzájomne vymiename počty hlasov na rôznych miestach, musíme vymienať aj mená kandidátov.

Časť kódu by teda mohla vyzerať nasledovne:

viem vyhodnot
  urobTu "h1 :hlasy1
  urobTu "h2 :hlasy2
  urobTu "h3 :hlasy3

  urobTu "nadpolovica (:h1 + :h2 + :h3) / 2
  urobTu "m1 "|Kandidat 1|
  urobTu "m2 "|Kandidat 2|
  urobTu "m3 "|Kandidat 3|

  ak :h1 < :h2 [
    urobTu "pom :h1 urobTu "h1 :h2 urobTu "h2 :pom
    urobTu "pom :m1 urobTu "m1 :m2 urobTu "m2 :pom
  ]
  ak :h2 < :h3 [
    urobTu "pom :h2 urobTu "h2 :h3 urobTu "h3 :pom
    urobTu "pom :m2 urobTu "m2 :m3 urobTu "m3 :pom
  ]
  ak :h1 < :h2 [
    urobTu "pom :h1 urobTu "h1 :h2 urobTu "h2 :pom
    urobTu "pom :m1 urobTu "m1 :m2 urobTu "m2 :pom
  ]
koniec

Počty hlasov sme si uložili do premnných "h1, "h2 a "h3. Mená kandidátov do premenných "m1, "m2 a "m3. Na vzájomnú výmenu hodnôt dvoch premenných sme využili pomocnú premennú "pom. Teraz vieme, že hlasy aj mená kandidátov máme usporiadané od najväčšieho počtu hlasov po najmenší, teda :h1: ≥ :h2 ≥ :h3.

V nasledujúcej časti voľby vyhodnotíme. Najskôr zistíme, či voľby majú vítaza. Víťazom je ten, kto získal nadpolovičnú väčšinu hlasov. Keďzě počty hlasov máme usporiadané, počty hlasov môžného víťaza nájdeme na prvom mieste.

Ak voľby nemajú víťaza, do druhé kola postupujú "tí kandidáti, ktorí získali prvý alebo druhý najvyšší počet hlasov". Uvedomme si však, že prvý alebo druhý najvyšší počet hlasov mohlo získať viacero kandidátov. Dokonca, všetci mohli získať najvyšši počet hlasov. Túto situáciu vyriešime jednoduchým testom. Ak sú počty hlasov na druhom a treťom mieste rôzne, postupjú len prvý dvaja. Ak sa rovnajú, postupuje ešte aj tretí kandidát. Výsledná procedúra teda môže vyzerať nasledovne:

viem vyhodnot
  urobTu "h1 :hlasy1
  urobTu "h2 :hlasy2
  urobTu "h3 :hlasy3

  urobTu "nadpolovica (:h1 + :h2 + :h3) / 2
  urobTu "m1 "|Kandidat 1|
  urobTu "m2 "|Kandidat 2|
  urobTu "m3 "|Kandidat 3|

  ak :h1 < :h2 [
    urobTu "pom :h1 urobTu "h1 :h2 urobTu "h2 :pom
    urobTu "pom :m1 urobTu "m1 :m2 urobTu "m2 :pom
  ]
  ak :h2 < :h3 [
    urobTu "pom :h2 urobTu "h2 :h3 urobTu "h3 :pom
    urobTu "pom :m2 urobTu "m2 :m3 urobTu "m3 :pom
  ]
  ak :h1 < :h2 [
    urobTu "pom :h1 urobTu "h1 :h2 urobTu "h2 :pom
    urobTu "pom :m1 urobTu "m1 :m2 urobTu "m2 :pom
  ]

  ak2 :h1 > :nadpolovica [
    pis :m1
  ][
    ak2 :h2=:h3 [
      pis :m1 pis :m2 pis :m3
    ][
      pis :m1 pis :m2
    ]
  ]
koniec

Vaše zaujímavé riešenia a najčastejšie chyby

V tejto úlohe ste mali asi najväčši problém s porozumením textu "postupujú tí kandidáti, ktorí získali prvý alebo druhý najvyšší počet hlasov". Často ste preto zabudli na prípad, ak postupújú všetci kandidáti.

Chybou bolo aj to, že namiesto nadpolovičnej väčšiny ste zisťovali len to, či nejaký kandidát má viac hlasov ako jeho protikandidáti. To však nestačí.

Pochváliť chceme tím Expert Nezapamatatelny, ktorý ako jediný mal úplne správne riešenie.