2646 - impartire

From Bitnami MediaWiki

Cerința[edit | edit source]

Se dau n numere naturale, unde n este un număr par. Se grupează cele n numere în perechi şi pentru fiecare pereche de numere se află restul împărţirii unui număr din pereche la celălalt. Se cere să se afle valoarea minimă a sumei acestor resturi.

Date de intrare[edit | edit source]

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

Date de ieșire[edit | edit source]

Programul va afișa pe ecran suma minimă a resturilor. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Nu corespunde restricțiilor".

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

  • 2 ≤ n ≤ 18
  • cele n numere citite vor fi mai mici decât 1.000

Exemplul 1[edit | edit source]

Intrare

4
6 5 3 4

Ieșire

1

Exemplul 2[edit | edit source]

Intrare

20

consola

Numărul n nu corespunde restricțiilor.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def verificare_restrictii(n, numbers):

   # Verifică dacă n este un număr par și se află în intervalul [2, 18]
   if n % 2 != 0 or n < 2 or n > 18:
       return False, "Numărul n nu corespunde restricțiilor."
   # Verifică restricțiile pentru numerele naturale
   for num in numbers:
       if num >= 1000:
           return False, "Numerele nu corespund restricțiilor."
   return True, ""

def calculeaza_suma_resturilor(permutare):

   return sum(permutare[i] % permutare[i+1] for i in range(0, len(permutare), 2))

def backtracking(permutare, vizitate, n, numbers, suma_minima):

   if len(permutare) == n:
       suma = calculeaza_suma_resturilor(permutare)
       suma_minima[0] = min(suma_minima[0], suma)
       return
   for i in range(n):
       if not vizitate[i]:
           permutare.append(numbers[i])
           vizitate[i] = True
           backtracking(permutare, vizitate, n, numbers, suma_minima)
           permutare.pop()
           vizitate[i] = False

def main():

   # Citire număr n de la tastatură
   n = int(input("Introduceți numărul n: "))
   # Verificare restricții
   valid, mesaj_eroare = verificare_restrictii(n, [])
   if not valid:
       print("Eroare:", mesaj_eroare)
       return
   # Citire cele n numere naturale de la tastatură
   numbers = list(map(int, input("Introduceți cele {} numere naturale separate prin spații: ".format(n)).split()))
   # Verificare restricții pentru numerele introduse
   valid, mesaj_eroare = verificare_restrictii(n, numbers)
   if not valid:
       print("Eroare:", mesaj_eroare)
       return
   permutare = []
   vizitate = [False] * n
   suma_minima = [float('inf')]
   backtracking(permutare, vizitate, n, numbers, suma_minima)
   print("Suma minimă a resturilor este:", suma_minima[0])

if __name__ == "__main__":

   main()

</syntaxhighlight>