Lukáš tvrdo pracoval na svojom startupe a podarilo sa mu ho predať za veeľa peňazí firme Mäta. Nevedel čo s toľkými peniazmi, tak si povedal že pôjde do kasína.
V kasíne sa hádžu $n$-stenné kocky $m$-krát. Vašou úlohou je zistiť, či v daných hodoch padlo každé číslo 1 až $n$ aspoň raz. Pozor, 1 sa ráta ako žolík a môže nahradiť iné číslo. Ak to platí, označíme to že máme “postupku”.
V prípade že sa v týchto hodoch nachádza postupka, vypíšte najčastejší hod. Ak ich je viacero, ten najnižší (ak sme hodili 4,6 aj 9 20-krát, vypíšte 4). Ak sa nenachádza v hodoch postupka, vypíšte 0.
V prvom riadku vstupu je číslo $n$ ($1 \leq n \leq 10^6$) udávajúce maximálne číslo na kocke V druhom riadku vstupu je číslo $m$ udávajúce počet hodov kockou. Následne nasleduje $m$ riadkou s hodnotami hodov od 1 po n.
V jednotlivých sadách platia nasledujúce obmedzenia:
| Sada | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| $1 \leq n \leq$ | $50$ | $5 \ 000$ | $5 \times 10^4$ | $5 \times 10^5$ |
| $n \leq m \leq$ | $100$ | $10^4$ | $10^5$ | $10^6$ |
Ak sa medzi hodených kockách nachádza postupka od 1 po $n$ vypíš číslo ktore sa medzi hodeními kockami vyskytovalo najčastejšie(ak ich je viac vypíš najmenšie). Pokiaľ tam neni postupka vypíš 0.
3
5
1
2
2
2
2
0
Nenachádza sa tu postupka od 1 do 3.
3
5
3
2
3
1
2
2
Nachádza sa tam postupka od 1 do 3, najviac krát sa tam nachádza 2 a 3 ale 2 je menšie takže vypíšem 2.
3
5
1
1
2
1
2
1
Nachádza sa tam postupka od 1 do 3 (1 vie “zastúpiť 3”), najviackrát sa tam nachádza 1.
Táto úloha mala dve časti:
Prvý krok dokážeme spraviť v $O(m)$ - počet hodov kocky. Je to preto, že si spravíme pole dĺžky n (počet stien kocky). Vždy keď narazíme na hod i, tak zvýšime i-tý index o 1. Druhý krok vieme spraviť v $O(n)$, keďže potrebujeme zistiť, či každý prvok nášho predpočítaného poľa je viac ako jedna, prípadne ho nahradíme žolíkom - 1kou.
Spolu je teda časová zložitosť $O(n+m)$.
Program v pythone mohol vyzerať napríklad takto:
def over_postupku(pocetStien:int, pocetHodovN:list[int]):
postupka = 1
for i in range(pocetStien):
if pocetHodovN[i] == 0:
if pocetHodovN[0] >= 0:
pocetHodovN[0] -= 1
else:
postupka = 0
break
return postupka
def zrataj_hody(pocetStien:int, pocetHodov:int):
pocetHodovN = pocetStien * [0]
for _ in range(pocetHodov):
hod = int(input()) -1
pocetHodovN[hod] += 1
return pocetHodovN
pocetStien = int(input())
pocetHodov = int(input())
pocetHodovN = zrataj_hody(pocetStien, pocetHodov)
postupka = over_postupku(pocetStien, pocetHodovN)
if postupka == 1:
print(pocetHodovN.index(max(pocetHodovN)) +1)
else:
print(0)
Súťaž PRASK zastrešuje občianske združenie Trojsten.
Trojsten, o.z.
FMFI UK, Mlynská dolina
842 48 Bratislava
Programátorská súťaž pre stredoškolákov
Tímová matematicko-fyzikálna súťaž pre základoškolákov
Materiály a úlohy na výučbu programovania