2646 - impartire
De la Universitas MediaWiki
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ât1.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()