Autorské riešenie
Podľa zadania, príchody a odchody účastníkov na party sa zaznamenávajú ako dvojprvkové zoznamy. Úlohou bolo zistiť, aký najväčší počet ludí bol naraz prítomný v jednom čase. Úloha sa dá riešiť rôzne, uvedieme jedno z riešení. Pre riešenie sú dôležité časové záznamy, keď niekto na párty prišiel a keď niekto z párty odišiel. Ak by sme tieto záznamy usporiadali v čase, úloha by bola jednoduchá. Postupne budeme záznamami prechádzať. Ak narazíme na záznam príchodu, zväčšime počet účastníkov. Ak narazíme na záznam odchodu, zmenšíme počet účastníkov. Zároveň si pamätáme, aký najväčši počet účastníkov sme zaznamenali. Aby sme si nemuseli pamätať, ktorý časový údaj je záznam príchodu a ktorý je záznam odchodu, rozdelíme si časové záznamy do dvoch zoznamov. Do jedneho uložíme časy príchodov a do druhého časy odchodov. Obidva zoznamy si usporiadame Napríklad, záznamy [[11,30],[12,30],[13,30], [1, 31] rozdelíme na príchody a odchody: prichody: [1, 11, 12, 13] odchody: [30, 30, 30, 31] Funkca na rozdelenia zaznamov môžze vyzerať nasledovne: #Python def rozdel(zaznamy): '''Zoznam prichodov a odchodov rozdeli na dva zoznamy. Zoznam prichodov a zoznam odchodov. :param zaznamy: Zoznam dvojic: prichod, odchod. :type zaznamy: list of lists :return: Zoznam prichodov a zoznam odchodov :rtype: tuple(list, list) ''' prichody = [] odchody = [] for zaznam in zaznamy: prichody.append(zaznam[0]) #pridame cas prichodu do zoznamu príchodov odchody.append(zaznam[1]) #pridame cas odchodu do zoznamu odchodov prichody.sort() #zoradenie prvkov zoznamov odchody.sort() return prichody, odchody Súčasne prechádzame zoznamami príchodov a odchodov. Ak aktuálny prvok v zozname príchodov je menší ako aktuálny prvok v zozname odchodov, niekto na párty prišiel. Zavýšime počet účastníkov a v zozname príchodov sa posunieme na ďalší prvok. Ak aktuálny prvok v zozname odchodov je menší ako aktuálny prvok v zozname príchodov, niekto z párty odišiel. Znížime počet účastníkov a v zozname odchodov sa posunieme na ďalší prvok. Tento postup opakujeme dovtedy, kým sa v zozname príchodov nedostaneme na koniec. Od tejto chvíle už nasledujú len odchody a počet účastníkov za bude už len znižovať. Funkcia maximum_pritomnych() môže vyzerať takto: # Python def maximum_pritomnych(zaznamy): '''Podla zaznamu prichodov a odchodov zisti, najviac kolko ludi bolo na party pritomnych v jednom case :param zaznamy: Zoznam dvojic: prichod, odchod. :type zaznamy: list of lists :return: MňaAximalny pocet ludi pritomnych na party v jednom case, :rtype: int ''' prichody, odchody = rozdel(zaznamy) max_pocet = 0 # maximálny počet prítomných v danom čase akt_pocet = 0 # aktuálny počet prítomných počas sledovania idx_prichody = 0 # index v zozname prichodov idx_odchody = 0 # index v zozname odchodov while idx_prichody < len(prichody): if prichody[idx_prichody] <= odchody[ # ak nastal prichod, zvysime pocet ludi na party idx_odchody]: akt_pocet = akt_pocet + 1 if akt_pocet > max_pocet: max_pocet = akt_pocet idx_prichody = idx_prichody + 1 else: # ak nastal odchod, znizime pocet ludi na party akt_pocet = akt_pocet - 1 idx_odchody = idx_odchody + 1 return max_pocet Vaše zaujímavé riešenia a najčastejšie chyby Úlohu väčšina z Vás riešila pomocou dvoch, alebo aj troch cyklov, postupne ste prechádzali zoznamom príchodov a pomocou vnoreného cyklu ste testovali odchody, čím ste dosiahli správny výsledok, ale nie sú to efektívne riešenia. Niektorí ste testovali aj to, či zadané vstupy sú správne, teda čas príchodu nie je väčší ako čas odchodu. V zadaní síce bolo stanovené, že vstupy sú vhodne zadané, ale z programátorského hľadiska je korektné aj to testovať. Pozitívne hodnotíme aj to, ak premenné ste pomenovali tak, aby význam názvu priamo naznačil obsah. |
|||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |