1460 - Serbare

De la Universitas MediaWiki

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

# 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.")