Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 14/18 = 77,79 %

  • Úspešnosť riešenia: 3,00 / 5 = 60,00 %

Podľa zadania úlohy je systém upratovania taký, že sa opakuje nasadenie do práce jeden deň len jedného robota, ďalší deň len druhého robota, ďalší deň oboch robotov atď. Potom pri riešení úlohy môžeme uvažovať, koľko práce sa urobí za viacero kompletných trojdní a koľko za zvyšných 1 až 3 dní.

Označme premennou d1 počet dní, za ktoré urobí celú prácu prvý robot a premennou d2 počet dní, za ktoré urobí celú prácu druhý robot. Potom za jeden deň prvý robot urobí 1 / d1 práce, druhý robot za ďalší deň urobí 1 / d2 práce a za ďalší deň oba roboty urobía 1 / d1 + 1 / d2 práce. Za trojicu nasledujúcich dní urobia roboty podľa uvedeného systému spolu 2 / d1 + 2 / d2 práce, čo označíme premennou praca_za_3dni. Počet kompletných trojdní, ktoré označíme premennou pocet_3dni, vypočítame ako celú časť prevrátenej hodnoty premennej praca_za_3dni. Množstvo práce vykonané za kompletné trojdní, ktoré označíme premennou mnozstvo_prace, vypočítame ako súčin praca_za_3dni * pocet_3dni.

rozbor prípadov spoločnej práce 2 robotov

Podľa vypočítaného množstva práce za kompletné trojdni môžeme uvažovať nasledovné prípady:

  • ak mnoztvo_prace je rovné 1, tak celkový počet dní je  3 * pocet_3dni,

  • ak mnoztvo_prace zvýšené o prácu výkonnejšieho robota (t.j. 1 / min(d1,d2)) je rovné alebo väčšie ako 1, tak celkový počet dní je  3 * pocet_3dni + 1,

  • ak mnoztvo_prace zvýšené o samostatnú prácu robotov v nasledujúcich 2 dňoch (t.j. 1 / d1 + 1 / d2) je rovné alebo väčšie ako 1, tak celkový počet dní je  3 * pocet_3dni + 2,

  • inak celkový počet dní je  3 * pocet_3dni + 3.

Výsledné riešenie úlohy zapísané v programovacom jazyku Python môže vyzerať nasledovne:
def pocet_dni(d1, d2):
    praca_za_3dni = (2 / d1 + 2 / d2)
    pocet_3dni = 1 // praca_za_3dni
    mnozstvo_prace = praca_za_3dni * pocet_3dni
    if mnozstvo_prace == 1:
        return 3 * pocet_3dni
    elif mnozstvo_prace + 1 / min(d1, d2) >= 1:
        return 3 * pocet_3dni * 3 + 1
    elif mnozstvo_prace + 1 / d1 + 1 / d2 >= 1:
        return 3 * pocet_3dni + 2
    else:
        return 3 * pocet_3dni + 3



print(pocet_dni(10, 3))     # 4.0

Táto úloha je zameraná na: 

  • použitie rôznych stratégii riešenia problémov (hľadanie vzoru, dekompozície problému na podproblémy),

  • precvičenie príkazov vetvenia, volania funkcií s parametrami a návratovou hodnotou,

  • použitie matematických výpočtov s celými číslami (celočíselné delenie, funkcia minimum).

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

Do riešenia tejto úlohy sa zapojilo 14 tímov z  kategórie EXPERT.  Plný počet bodov neziskal žiaden tím. Vo väčšine riešení autori použili cyklus, a len v dvoch riešenia boli použité len príkazy vetvenia (podobne ako v autorskom riešení).

V niektorých autorských riešeniach sa pri použití cyklu prejavili nepresnosti spôsobené špecifikami aritmetiky počítača, ktoré sme nepenalizovali stratou bodov.

V riešeniach sme zaregistrovali nasledovné nedostatky, vychádzajúce najčastejšie z nedôslednej analýzy problému, tvorby menej efektívneho riešenia či z pretrvávajúcich programátorských zlozvykov:

  • redukovanie riešenia úlohy len na prípad, keď majú oba roboty rovnaký výkon,

  • nezohľadnenie požiadavky na čo najskoršie upratanie mesta, čo sa prejavilo aj v rôznych výsledkov pri prehodení výkonov robotov. V riešení mal byť najprv nasadený výkonnejší robot,

  • namiesto použitia funkcií s parametrami použitie globálnych premenných s príkazom input a funkciami bez parametrov,

  • namiesto plnovýznamových identifikátorov premenných použitie málohovoriacich jednopísmenových identifikátorov.