1460 - Serbare

From Bitnami MediaWiki

Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 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[edit | edit source]

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[edit | edit source]

serbarein.txt
3 3
20 q
20 3
30 3000
serbareout.txt
Datele de intrare nu corespund restrictiilor impuse.


Explicaţii[edit | edit source]

Tipul 2 de uniformă este purtat de 50 de copii, tipul 1 de 30 de copii, iar tipul 3 de 20 de copii.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 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>