3790 - subsets: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/3790/subsets - subsets] ---- == Cerinţa == Se dă șirul '''a1, a2, …, an''' de numere naturale nenule distincte. Vrem să alegem trei submulțimi '''X, Y și Z''' cu proprietățile: * submulțimile sunt nevide * orice element din șir aparține cel mult unei submulțimi * cele trei submulțimi au suma elementelor identică De exemplu, dacă '''a = (1,2,3,4,5,6)''', atunci putem alege submulțimile: '''X={1,4}, Y={2,3}, Z={5}'''. S...
 
No edit summary
Line 46: Line 46:
== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#3790 - subsets


def numara_tripleturi(n, vector):
    def verifica_suma_egala(submultimi):
        sume = []
        for submultime in submultimi:
            sume.append(sum(submultime))
        return len(set(sume)) == 1
       
    def backtracking(index, submultimi):
        nonlocal numar
        if index == n:
            if len(submultimi[0]) > 0 and len(submultimi[1]) > 0 and len(submultimi[2]) > 0 and verifica_suma_egala(submultimi):
                numar += 1
            return
        for i in range(3):
            submultimi[i].append(vector[index])
            backtracking(index + 1, submultimi)
            submultimi[i].pop()
    numar = 0
    submultimi = [[], [], []]
    backtracking(0, submultimi)
    return numar // 2
   
   
def conform_restrictiilor(n,vector):
    if not 3 <= n <= 10:
        print("Datele nu sunt conform restricțiilor impuse.")
        return False
    for x in vector:
        if x > 100 or x == 0:
            print("Datele nu sunt conform restricțiilor impuse.")
            return False
    print("Datele sunt corecte.")
    return True
       
if __name__ == '__main__':
    n = int(input())
    vector = list(map(int, input().split()))
    if conform_restrictiilor(n,vector) is True:
      rezultat = numara_tripleturi(n,vector)
      print(rezultat)





Revision as of 18:45, 19 April 2023

Sursa: - subsets


Cerinţa

Se dă șirul a1, a2, …, an de numere naturale nenule distincte. Vrem să alegem trei submulțimi X, Y și Z cu proprietățile:

  • submulțimile sunt nevide
  • orice element din șir aparține cel mult unei submulțimi
  • cele trei submulțimi au suma elementelor identică

De exemplu, dacă a = (1,2,3,4,5,6), atunci putem alege submulțimile: X={1,4}, Y={2,3}, Z={5}. Se observă că au toate suma elementelor egală cu 5 și că 6 nu apare în niciuna din submulțimi. O altă alegere este X={1,6}, Y={2,5}, Z={3,4} și în acest caz toate submulțimile au suma 7 și toate elementele șirului aparțin uneia dintre submulțimi.

Reținem faptul că ordinea elementelor într-o submulțime nu contează, deci X={1,4} este totuna cu X={4,1}. De asemenea, ordinea celor trei submulțimi nu contează, adică de exemplu X={1,4}, Y={2,3}, Z={5} înseamnă același triplet cu X={2,3}, Y={1,4}, Z={5}.

Să se determine numărul tripletelor de submulțimi care îndeplinesc proprietățile.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n cele numere naturale a1, a2, …, an, separate prin spații.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi va afișa pe ecran numărul tripletelor de submulțimi. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricţii şi precizări

  • 3 ≤ n ≤ 10
  • cele n numere din șir vor fi nenule, distincte două câte două și mai mici decât 100

Exemple

Exemplul 1

Intrare
6
1 2 3 4 5 6
Ieșire
Datele sunt corecte.
3

Exemplul 2

Intrare
5
1 2 3 4 7
Ieșire
Datele sunt corecte.
0

Exemplul 3

Intrare
2
314515341535441 412351541241
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare

<syntaxhighlight lang="python" line>

  1. 3790 - subsets

def numara_tripleturi(n, vector):

   def verifica_suma_egala(submultimi):
       sume = []
       for submultime in submultimi:
           sume.append(sum(submultime))
       return len(set(sume)) == 1
       
   def backtracking(index, submultimi):
       nonlocal numar
       if index == n:
           if len(submultimi[0]) > 0 and len(submultimi[1]) > 0 and len(submultimi[2]) > 0 and verifica_suma_egala(submultimi):
               numar += 1
           return
       for i in range(3):
           submultimi[i].append(vector[index])
           backtracking(index + 1, submultimi)
           submultimi[i].pop()
   numar = 0
   submultimi = [[], [], []]
   backtracking(0, submultimi)
   return numar // 2
   
   

def conform_restrictiilor(n,vector):

   if not 3 <= n <= 10:
       print("Datele nu sunt conform restricțiilor impuse.")
       return False
   for x in vector:
       if x > 100 or x == 0:
           print("Datele nu sunt conform restricțiilor impuse.")
           return False
   print("Datele sunt corecte.")
   return True
       

if __name__ == '__main__':

   n = int(input())
   vector = list(map(int, input().split()))
   if conform_restrictiilor(n,vector) is True:
      rezultat = numara_tripleturi(n,vector)
      print(rezultat)


</syntaxhighlight>

Explicaţie cod