0533 - Aliniere

From Bitnami MediaWiki

Cerinţa[edit | edit source]

La ora de educație fizică participă n elevi, numerotați de la 1 la n, băieți și fete, pentru fiecare dintre ei cunoscându-se înălțimea, exprimată în centimetri. Profesorul le cere să se alinieze, mai întâi băieții, în ordine descrescătoare a înălțimii, apoi fetele, de asemenea în ordine descrescătoare.

Afișați numerele de ordine ale elevilor în ordinea dorită de profesor. Dacă doi băieți (sau fete) au aceeași înălțime, se va afișa mai întâi elevul cu numărul de ordine mai mic.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n, iar apoi n caracteristicile celor n elevi, astfel: o literă (B sau F), care definește sexul elevului, și înălțimea acestuia, un număr natural nenul.

Date de ieşire[edit | edit source]

Programul va afișa pe ecran numerele de ordine ale elevilor în ordinea dorită de profesor, separate prin exact un spațiu.

Restricții și precizări[edit | edit source]

  • 1 ⩽ n ⩽ 100
  • înălțimile elevilor vor fi mai mici decât 200

Exemplu[edit | edit source]

Intrare
5
B 176
F 160
F 165
B 180
B 179
Ieșire
Datele de intrare corespund restrictiilor impuse
4 5 1 3 2


Exemplu 2[edit | edit source]

Intrare
5
B 176
F 250
F 165
B 180
B 179
Ieșire
Datele de intrare nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

def validare(numar, elev): # functia de validare a datelor de intrare

   if len(elev) != numar:
       raise ValueError
   if numar > 100:
       raise ValueError
   for gender, height in elev:
       if gender not in ['B', 'F'] or not isinstance(height, int) or height < 1 or height > 200:
           raise ValueError
   print("Datele de intrare corespund restrictiilor impuse")


def elevi_ordonati(numar, elev): # functia de rezolvare

   # Separăm elevii în două liste: băieți și fete
   baieti = []
   fete = []
   for nr in range(numar):
       sexul, height = elev[nr]
       if sexul == "B":
           baieti.append((nr + 1, height))
       else:
           fete.append((nr + 1, height))
   # Sortăm listele în ordine descrescătoare a înălțimii
   baieti.sort(key=lambda x: (-x[1], x[0]))
   fete.sort(key=lambda x: (-x[1], x[0]))
   # Concatenăm listele băieților și fetelor
   eleviordonati = baieti + fete
   return [elev[0] for elev in eleviordonati]


if __name__ == '__main__':

   # din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam
   try:
       n = int(input("Introduceți numărul n: "))
       elevi = []
       for i in range(n):
           sex, inaltime = input().split()
           elevi.append((sex, int(inaltime)))
       validare(n, elevi)  # apelul functiei de validare
       result = elevi_ordonati(n, elevi)  # apelul functiei de rezolvare
       print(" ".join(map(str, result)))
   except ValueError:
       print("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       print("Datele de intrare nu corespund restrictiilor impuse")


</syntaxhighlight>