2460 - multimi5

From Bitnami MediaWiki

Enunt[edit | edit source]

O mulțime cu elemente numere naturale poate fi scrisă într-o formă redusă dacă, ordonând crescător elementele ei, diferența dintre oricare două valori alăturate este aceeași. De exemplu, mulțimea D={11, 14, 17, 20, 23} poate fi scrisă sub forma D=11-23/3, precizând elementul minim, elementul maxim și diferența dintre elemente. Date fiind N mulțimi scrise sub forma redusă, fiecare fiind notată cu o literă mare a alfabetului englez, se cere să se calculeze o expresie care poate conține:

  • operația de reuniune, notată cu +;
  • operația de intersecție, notată cu *;
  • literele asociate mulțimilor;
  • paranteze rotunde.

Considerăm că valoarea expresiei este mulțimea obținută după efectuarea operațiilor specifice mulțimilor considerând că operațiile de intersecție au prioritate mai mare decât cele de reuniune.

Cerinta[edit | edit source]

Cunoscând forma redusă a celor N mulțimi și o expresie, să se calculeze valoarea expresiei date.

Date de intrare[edit | edit source]

Datele de intrare se citesc din fişierul multimi5.in, care are următoarea structură: - Pe prima linie se află numărul natural N, reprezentând numărul mulțimilor; - Pe următoarele N linii se află formele reduse ale celor N mulțimi, câte o mulțime pe fiecare linie; - Pe linia N+2 se află expresia ce trebuie calculată.

Date de iesire[edit | edit source]

Datele de ieşire se vor scrie în fişierul multimi5.out, astfel: - Pe prima linie se va scrie numărul elementelor mulțimii obținute în urma evalării expresiei date; - Pe linia a doua se vor scrie, în ordine crescătoare, elementele mulțimii respctive, separate prin câte un spațiu.

Restrictii si precizari[edit | edit source]

  • 1 < N ≤ 16
  • Elementele mulțimilor sunt numere naturale cuprinse între 0 și 1.000.000.000;
  • Numărul elementelor unei mulțimi este maximum 10.000;
  • Numărul caracterelor expresiei este cuprins între 3 și 1000;
  • Forma redusă a unei mulțimi și expresia dată nu conțin spații;
  • Se garantează că, pentru toate datele de test, valoarea expresiei nu poate fi mulțimea vidă;
  • Se garantează că, în teste care totalizează 30 de puncte, expresia nu conține paranteze;
  • Se garantează că, în teste care totalizează 60 de puncte, cardinalul fiecărei mulțimi date la intrare nu depășește valoarea 1000;

Exemplul 1[edit | edit source]

intrare
3
A=2-8/2
C=11-23/3
B=4-16/4
A*(B+C)
iesire
Datele introduse corespund restrictiilor impuse.
2
4 8

Exemplul 2[edit | edit source]

intrare
3
A=10-2/2
B=3-7/2
C=8-12/2
C*A+A*C
Datele de intrare nu corespund restrictiilor impuse.

Rezlvare[edit | edit source]

<syntaxhighlight lang="python3"line="1">

  1. 2460 - multimi5

def eval_multime_redusa(minim, dif, n):

   return minim + n * dif

def eval_expresie(multimi_reduse, expresie):

   stack = []
   current_set = None
   for char in expresie:
       if char.isalpha():
           # Dacă este o literă, adaugă mulțimea corespunzătoare la stivă
           current_set = eval_multime_redusa(*multimi_reduse[char], n=1)
           stack.append(set([current_set]))
       elif char == '*':
           # Operație de intersecție
           set_b = stack.pop()
           set_a = stack.pop()
           result_set = set_a.intersection(set_b)
           stack.append(result_set)
       elif char == '+':
           # Operație de reuniune
           set_b = stack.pop()
           set_a = stack.pop()
           result_set = set_a.union(set_b)
           stack.append(result_set)
       elif char == '(':
           # Deschide paranteză, adaugă mulțimea curentă la stivă
           stack.append(current_set)
       elif char == ')':
           # Închide paranteza, evaluează operațiile până la ultima paranteză deschisă
           current_set = stack.pop()
           stack.pop()
           stack.append(current_set)
   return stack[0]
  1. Presupunem că avem următoarele mulțimi reduse

multimi_reduse = {

   'A': (10, 2),
   'B': (5, 3),
   'C': (8, 4)

}

  1. Și o expresie

expresie = '(A * B) + C'

  1. Evaluăm expresia

rezultat = eval_expresie(multimi_reduse, expresie)

print(rezultat)

</syntaxhighlight>