1460 - Serbare: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == 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 '''serbare.in''' conține, pe prima linie, numerele '''n''' şi '''p''', separate printr-un s...
 
No edit summary
 
Line 2: Line 2:
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.
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 ==
== Date de intrare ==
Fișierul de intrare '''serbare.in''' 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ă.
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 ==
== Date de ieşire ==
Fișierul de ieșire '''serbare.out''' 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.
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 ==
== Restricții și precizări ==
* 1 ⩽ n ⩽ 1000
* 1 ⩽ n ⩽ 1000
Line 10: Line 10:
* Numărul de copii dintr-o grupă este cel mult '''100'''
* 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
* Fiecare mărime de uniformă din intervalul '''[1,p]''' este purtată de cel puţin un copil
== Exemplu ==
== Exemplul 1 ==
; serbare.in
; serbarein.txt
: 5 3
: 5 3
: 20 2
: 20 2
Line 18: Line 18:
: 20 1
: 20 1
: 10 1
: 10 1
; serbare.out
; serbareout.txt
: Datele de intrare corespund restrictiilor impuse.
: 2 1 3
: 2 1 3
<br>
== Exemplul 2 ==
; serbarein.txt
: 3 3
: 20 q
: 20 3
: 30 3000
; serbareout.txt
: Datele de intrare nu corespund restrictiilor impuse.
<br>
== Explicaţii ==
== 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.
Tipul '''2''' de uniformă este purtat de '''50''' de copii, tipul '''1''' de '''30''' de copii, iar tipul '''3 '''de '''20''' de copii.
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
# Deschidem fișierul de intrare
# 1460  Serbare
with open('serbare.in', 'r') as intrare:
def validare(n_validare, p_validare, grupe_validare):
     # Citim numărul de grupe și tipuri de uniforme
     if n_validare < 1 or n_validare > 1000:    # Verificăm dacă n este în intervalul 1-1000
     n, p = map(int, intrare.readline().split())
        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
    # Inițializăm un dicționar pentru a stoca numărul total de copii pentru fiecare tip de uniformă
        raise ValueError  # Ridicăm o eroare dacă p nu este în intervalul 1-11
     uni = {i: 0 for i in range(1, p+1)}
     for grup in grupe_validare:    # Parcurgem lista de grupe
   
        # Verificăm dacă numărul de copii este în intervalul 1-100
     # Parcurgem fiecare grup
        if grup[0] < 1 or grup[0] > 100:
     for _ in range(n):
            raise ValueError
         # Citim numărul de copii și tipul de uniformă
        # Verificăm dacă tipul de uniformă este în intervalul 1-p
         copii, uni_tip = map(int, intrare.readline().split())
        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ă
         # Adăugăm numărul de copii la totalul pentru tipul respectiv de uniformă
         uni[uni_tip] += copii
         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")


# Sortăm tipurile de uniforme în ordinea descrescătoare a numărului total de copii
    try:
sort_uni = sorted(uni.items(), key=lambda x: x[1], reverse=True)
        # 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')


# Deschidem fișierul de ieșire
    except ValueError:
with open('serbare.out', 'w') as iesire:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse.")
     # Scriem tipurile de uniforme în fișier, separate printr-un spațiu
     except IndexError:
    iesire.write(' '.join(str(uni[0]) for uni in sort_uni))
        file_out.write("Datele de intrare nu corespund restrictiilor impuse.")


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 15:04, 11 November 2023

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>