2646 - impartire

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerința

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

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

Date de ieșire

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

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

Exemplul 1

Intrare

4
6 5 3 4

Ieșire

1

Exemplul 2

Intrare

20

consola

Numărul n nu corespunde restricțiilor.

Rezolvare

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()