3974 - IRDDS

From Bitnami MediaWiki

Cerința[edit | edit source]

Se dau 2 mulţimi de numere naturale A și B. Să se afișeze mulţimea rezultată în urma efectuării unei operații.

Date de intrare[edit | edit source]

Programul citește de la tastatură: Pe prima linie 2 numere naturale N și M, reprezentând numărul elementelor mulţimii A, respectiv B, urmate de unul dintre caracterele * + - % :

  • * intersecţie A∩B.
  • + reuniune A∪B.
  • - diferența A∖B.
  • % diferența simetrică (A∖B)∪(B∖A).

Pe cea de-a 2-a linie N numere naturale reprezentând elementele mulţimii A. Pe cea de-a 3-a linie M numere naturale reprezentând elementele mulţimii B.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran elementele mulţimii rezultate, ordonate crescător, în urma efectuării operaței.

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

  • 1 ≤ N, M ≤ 200.000
  • elementele mulţimilor A și B vor fi mai mici decât 1.000.000.000
  • nu există cazul ca în urma efectuării uneia dintre operatii rezultatul să fie egal cu mulţimea vidă.

Exemplul 1[edit | edit source]

Intrare
5 5 %
4 5 6 7 8
1 2 3 4 5
Ieșire
Datele introduse corespund restricțiilor impuse.
1 2 3 6 7 8

Explicație[edit | edit source]

({4,5,6,7,8}∖{1,2,3,4,5})∪({1,2,3,4,5}∖{4,5,6,7,8})={1,2,3,6,7,8}.

Exemplul 2[edit | edit source]

Intrare
5 5 %
4 5 6 7 8
1 2 3 4 5000000000
Ieșire
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

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

  1. 3974 - IRDDS

def validare(n_validare, m_validare, a_validare, b_validare):

   if n_validare < 1 or n_validare > 200000 or m_validare < 1 or m_validare > 200000:
       raise ValueError
   for numar in a_validare + b_validare:
       if numar < 1 or numar > 1000000000:
           raise ValueError
   print("Datele de intrare corespund restrictiilor impuse")
   return True


def operatie(a_operatie, b_operatie, op_operatie):

   if op_operatie == '*':
       rezultat_operatie = set(a_operatie).intersection(b_operatie)
   elif op_operatie == '+':
       rezultat_operatie = set(a_operatie).union(b_operatie)
   elif op_operatie == '-':
       rezultat_operatie = set(a_operatie).difference(b_operatie)
   elif op_operatie == '%':
       rezultat_operatie = set(a_operatie).symmetric_difference(b_operatie)
   else:
       raise ValueError("Operatia nu este valida")
   return sorted(list(rezultat_operatie))


if __name__ == '__main__':

   try:
       n_main, m_main, op_main = input(
           "Introduceti numarul de elemente din A, numarul de elemente din B si operatia "
       ).split()
       n_main = int(n_main)
       m_main = int(m_main)
       A_main = list(map(int, input("Introduceti elementele multimii A ").split()))
       B_main = list(map(int, input("Introduceti elementele multimii B ").split()))
       validare(n_main, m_main, A_main, B_main)
       rezultat_main = operatie(A_main, B_main, op_main)
       print(" ".join(map(str, rezultat_main)))
   except ValueError:
       print("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       print("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>