Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov: 11 / 13 = 85 %

  • Úspešnosť riešenia: 2,95  / 5 = 59 %

V skutočnej olympiáde z informatiky sú pravidlá ohľadom počtu medailí uvedené trochu voľnejšie. V našom riešení ich však budeme striktne dodržiavať. Pripomeňme si pravidlá:

  • medailu môže dostať nanajvýš polovica súťažiacich a chceme udeliť čo najviac medailí,

    • to znamená, že počet medailí môže byť aj 0, nie však viac ako polovica súťažiacich,

    • to znamená, že počet medailí by sa mal čo najviac priblížiť k polovici súťažiacich,

  • počty zlatých, strieborných a bronzových medailí sú v pomere 1:2:3,

    • to znamená že najmenší, nenulový počet medailí, ktoré môžeme udeliť je 6 (1 zlatá, 2 strieborné a 3 bronzové),

      • to znamená že najmenší počet súťažiacich, pri ktorých vieme nejaké medaily udeliť je 12,

    • to znamená, že počet udelených medailí musí byť násobkom čísla 6, 1+2+3, alebo 2+4+6 alebo 3+6+9 atď.

Isto ste si všimli, že v istých situáciách nevieme pravidlá dodržať. Ak by bol počet súťažiacich menší ako 12, nemali by sme udeliť žiadnu medailu. Pomer medailí 1:2:3 by teda nebol dodržaný. V tomto prípade úloha nemá riešenie.

Pozrime sa teraz na riešenie našej úlohy. Pre určenie počtu medailí nepotrebujeme vedieť bodové ohodnotenie jednotlivých súťažiacich, stačí nám len ich počet. Z počtu súťažiacich vieme zistiť, koľko najviac medailí môžeme udeliť - nanajvýš polovicu počtu súťažiacich. Navyše počet medailí musí byť  deliteľný číslom 6. Znížime teda polovicu súťažiacich na najbližší menší násobok čísla 6 (odpočítame zvyšok po delení 6). Získaný počet rozdelíme v pomere 1:2:3.

Časť riešenia môže vyzerať nasledovne: 

;Imagine logo
viem pocetMedaili :pocetSutaziacich
  urobTu "pocet (cPodiel :pocetSutaziacich 2) - (zvysok cPodiel :pocetSutaziacich 2 6)
  vy (zoznam :pocet / 6 :pocet / 3 :pocet / 2 )
koniec

#Python
def
pocetMedaili(pocetSutaziacich):
    pocet = pocetSutaziacich // 2 - pocetSutaziacich // 2 % 6
    return pocet // 6, pocet // 3, pocet // 2

Ak berieme do úvahy aj riešiteľnosť úlohy, doplníme podmienku riešiteľnosti:

;Imagine logo
viem pocetMedaili :pocetSutaziacich
  ak :pocetSutaziacich < 12 [
    vy "|Uloha nema riesenie|
  ]
  urobTu "pocet (cPodiel :pocetSutaziacich 2) - (zvysok cPodiel :pocetSutaziacich 2 6)
  vy (zoznam :pocet / 6 :pocet / 3 :pocet / 2 )
koniec

#Python
def
pocetMedaili(pocetSutaziacich):
    if pocetSutaziacich < 12:
        return "Úloha nemá riešenie."
    pocet = pocetSutaziacich // 2 - pocetSutaziacich // 2 % 6
    return pocet // 6, pocet // 3, pocet // 2

Všimnime si odlišný tvar aritmetických operácií v Imagine a v Python-e.

  Imagine Python
celočíselné delenie cPodiel delenec delitel delenec // delitel
zvyšok po celočíselnom delení zvysok delenec delitel delenec % delitel

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

Najčastejšou chybou bolo, že ste nedôsledne dodržali podmienky zadania. Výsledná procedúra, resp. funkcia mala vrátiť výsledné počty medailí. Nie ich vypísať. Ak procedúra/funkcia výsledok vracia, stáva sa omnoho univerzálnejšou. Tento vrátený výsledok môžeme vypísať alebo ho použiť ako súčasť ďalšieho výpočtu. Rovnako častou chybou bolo, že ste analýzou úlohy nezistili, že úloha nie je vždy riešiteľná.