2460 - multimi5
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">
- 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]
- Presupunem că avem următoarele mulțimi reduse
multimi_reduse = {
'A': (10, 2), 'B': (5, 3), 'C': (8, 4)
}
- Și o expresie
expresie = '(A * B) + C'
- Evaluăm expresia
rezultat = eval_expresie(multimi_reduse, expresie)
print(rezultat)
</syntaxhighlight>