3385 - Lumini 1
Enunt
Nicoleta, o fată curioasă, dorește să afle cine dintre colegii de clasă are bradul cu cele mai multe luminițe, cât și numărul de luminițe din acest brad. Fiind olimpică la informatică și iubind provocările, colegii i-au comunicat prin SMS doar numărul de divizori corespunzător numărului de luminițe din brad, acesta fiind și cel mai mic număr cu această proprietate. De exemplu, George, colegul de bancă, i-a dat numărul 5, corespunzător unui număr de 16 luminițe, mai exact D16 = {1, 2, 4, 8, 16}, iar 16 este numărul cel mai mic cu exact 5 divizori. Mesajele colegilor vor fi de forma: NrDiv Nume, unde NrDiv reprezintă numărul de divizori, iar Nume reprezintă numele colegului care a trimis mesajul.
Cerinţa
Scrieţi un program care să determine: 1) Numărul de luminițe din bradul cu cele mai multe luminițe. 2) Numele colegului care are bradul cu cele mai multe luminițe.
Date de intrare
Fișierul de intrare lumini.in conţine pe prima linie cerința 1 sau 2. Pe a doua linie numărul n, reprezentând numărul colegilor Nicoletei, iar pe următoarele n linii vor fi mesajele colegilor, sub forma descrisă în enunţ, câte un mesaj pe o linie.
Date de ieșire
Date de ieșire
Fișierul de ieșire lumini.out va conţine o singură linie pe care va fi scris numărul de luminițe al bradului cu cele mai multe luminițe (cerința 1) sau numele primului coleg din lista primită care are bradul cu cele mai multe luminițe (cerința 2).
Restricţii şi precizări
- 1 ≤ n ≤ 5000, n număr natural;
- 1 < NrDiv ≤ 120, NrDiv este număr natural;
- numele oricărui coleg are maximum 23 de caractere alfabetice;
- numărul maxim de luminițe din instalația de brad va fi 65536 (216).
Exemplul 1
- lumini.in
1 3 12 Tryp 13 Mike 14 Gymi
- lumini.out
4096
Explicație
Tryp are o instalație cu 60 de luminițe.
Mike are o instalație cu 4096 de luminițe.
Gymi are o instalație cu 192 de luminițe.
Exemplul 2
- lumini.in
2 6 22 Andreea 26 Iustina 40 Iuliana 26 Andreia 27 Corina 30 Raluca
- lumini.out
Iustina
Explicație
Iustina și Andreia, au fiecare câte o instalație cu 12288 de luminițe. Iustina apare prima în listă.
Rezolvare
<syntaxhighlight lang="python" line> def calculate_lights(N, messages):
max_divisors = 0 max_lights = 0 owner = ""
for message in messages: divisors, name = message.split() divisors = int(divisors) lights = divisors * (divisors + 1) // 2 if divisors > max_divisors or (divisors == max_divisors and lights > max_lights): max_divisors = divisors max_lights = lights owner = name
return max_lights if N == 1 else owner
def main():
with open("lumini.in", "r") as fin: choice = int(fin.readline().strip()) N = int(fin.readline().strip()) messages = [fin.readline().strip() for _ in range(N)]
result = calculate_lights(N, messages)
with open("lumini.out", "w") as fout: fout.write(str(result))
if __name__ == "__main__":
main()
</syntaxhighlight>