1460 - Serbare
Cerinţa
La o serbare sunt n grupe de copii care poartă p tipuri de uniforme. Scrieţi un program care să afişeze pe ecran tipurile de uniforme în ordinea descrescătoare a numărului total de copii ce poartă fiecare tip de uniformă. Afişarea se va face pe o singură linie, valoriile fiind separate printr-un spaţiu.
Date de intrare
Fișierul de intrare serbarein.txt conține, pe prima linie, numerele n şi p, separate printr-un spaţiu, iar pe următoarele n linii câte două valori separate printr-un spaţiu ce reprezintă numărul de copii dintr-o grupă şi respectiv tipul de uniformă pe care aceştia îl poartă.
Date de ieşire
Fișierul de ieșire serbareout.txt va conţine tipurile de uniforme în ordinea descrescătoare a numărului total de copii ce poartă fiecare tip de uniformă. Numerele vor fi separate printr-un spaţiu.
Restricții și precizări
- 1 ⩽ n ⩽ 1000
- 1 ⩽ p ⩽ 11
- Numărul de copii dintr-o grupă este cel mult 100
- Fiecare mărime de uniformă din intervalul [1,p] este purtată de cel puţin un copil
Exemplul 1
- serbarein.txt
- 5 3
- 20 2
- 20 3
- 30 2
- 20 1
- 10 1
- serbareout.txt
- Datele de intrare corespund restrictiilor impuse.
- 2 1 3
Exemplul 2
- serbarein.txt
- 3 3
- 20 q
- 20 3
- 30 3000
- serbareout.txt
- Datele de intrare nu corespund restrictiilor impuse.
Explicaţii
Tipul 2 de uniformă este purtat de 50 de copii, tipul 1 de 30 de copii, iar tipul 3 de 20 de copii.
Rezolvare
<syntaxhighlight lang="python" line>
- 1460 Serbare
def validare(n_validare, p_validare, grupe_validare):
if n_validare < 1 or n_validare > 1000: # Verificăm dacă n este în intervalul 1-1000 raise ValueError # Ridicăm o eroare dacă n nu este în intervalul 1-1000 if p_validare < 1 or p_validare > 11: # Verificăm dacă p este în intervalul 1-11 raise ValueError # Ridicăm o eroare dacă p nu este în intervalul 1-11 for grup in grupe_validare: # Parcurgem lista de grupe # Verificăm dacă numărul de copii este în intervalul 1-100 if grup[0] < 1 or grup[0] > 100: raise ValueError # Verificăm dacă tipul de uniformă este în intervalul 1-p if grup[1] < 1 or grup[1] > p_validare: raise ValueError file_out.write("Datele de intrare corespund restrictiilor impuse.\n")
def uniforme(grupe):
uni = {} # Inițializăm un dicționar gol for grup in grupe: # Parcurgem lista de grupe # Dacă tipul de uniformă nu se află încă în dicționar, îl adăugăm cu valoarea 0 if grup[1] not in uni: uni[grup[1]] = 0 # Adăugăm numărul de copii la totalul pentru tipul respectiv de uniformă uni[grup[1]] += grup[0] # Sortăm tipurile de uniforme în ordinea descrescătoare a numărului total de copii sort_uni = sorted(uni.items(), key=lambda x: x[1], reverse=True) return [uni[0] for uni in sort_uni] # Returnăm tipurile de uniforme sortate
if __name__ == '__main__':
file_in = open("serbarein.txt", "r") file_out = open("serbareout.txt", "w")
try: # Citim numărul de grupe și tipuri de uniforme n_main, p_main = map(int, file_in.readline().split()) # Citim datele pentru fiecare grup grupe_main = [list(map(int, file_in.readline().split())) for _ in range(n_main)] # Validăm datele de intrare validare(n_main, p_main, grupe_main) # Calculăm numărul total de copii pentru fiecare tip de uniformă rezultat_main = uniforme(grupe_main) # Scriem tipurile de uniforme în fișierul de ieșire, separate printr-un spațiu file_out.write(' '.join(str(uni) for uni in rezultat_main) + '\n')
except ValueError: file_out.write("Datele de intrare nu corespund restrictiilor impuse.") except IndexError: file_out.write("Datele de intrare nu corespund restrictiilor impuse.")
</syntaxhighlight>