1460 - Serbare

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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