1357 - Plus Minus: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: ==Cerința== Fie n un număr natural. Să se determine toate posibilitățile de alegere a semnelor + și - pentru care n = (+|-) 12 + (+|-) 22 + ... + (+|-) n2 ==Date de intrare== Fișierul de intrare plusminus.in conține pe prima linie numărul n. ==Date de ieșire== Fișierul de ieșire plusminus.out va conține pe fiecare linie o succesiune de n semne + sau - , separate prin câte un spațiu, reprezentând câte o soluție a problemei. Dacă nu există soluție, atunc...)
 
Fără descriere a modificării
 
Linia 30: Linia 30:
4) 9 = +12 + 22 + 32 + 42 – 52 + 62 – 72 – 82 + 92
4) 9 = +12 + 22 + 32 + 42 – 52 + 62 – 72 – 82 + 92
==Rezolvare==
==Rezolvare==
<syntaxhighlight lang="python3" line="1">
def solve_plus_minus(n, signs, current_sum, current_expression, result):
def solve_plus_minus(n, signs, current_sum, current_expression, result):
    if len(current_expression) == n:
        if current_sum == 0:
            result.append(" ".join(current_expression))
        return


    for sign in signs:
  if len(current_expression) == n:
        new_sum = current_sum + sign * (current_expression[-1] + 1) ** 2
      if current_sum == 0:
        if new_sum <= n:
          result.append(" ".join(current_expression))
            solve_plus_minus(n, signs, new_sum, current_expression + [sign], result)
      return
  for sign in signs:
      new_sum = current_sum + sign * (current_expression[-1] + 1) ** 2
      if new_sum <= n:
          solve_plus_minus(n, signs, new_sum, current_expression + [sign], result)


def plus_minus(n):
def plus_minus(n):
    signs = [-1, 1]  # -1 pentru minus, 1 pentru plus
    result = []


    # Inițial, începem cu primul termen, care este întotdeauna un plus
  signs = [-1, 1]  # -1 pentru minus, 1 pentru plus
    solve_plus_minus(n, signs, 1, [1], result)
  result = []
  # Inițial, începem cu primul termen, care este întotdeauna un plus
  solve_plus_minus(n, signs, 1, [1], result)
  if not result:
      result.append("IMPOSIBIL")
  return result
Citim input-ul


    if not result:
with open("plusminus.in", "r") as f:
        result.append("IMPOSIBIL")


    return result
  n = int(f.readline().strip())
Calculăm rezultatul


# Citim input-ul
result = plus_minus(n)
with open("plusminus.in", "r") as f:
    n = int(f.readline().strip())


# Calculăm rezultatul
Scriem rezultatul în fișierul de ieșire
result = plus_minus(n)


# Scriem rezultatul în fișierul de ieșire
with open("plusminus.out", "w") as f:
with open("plusminus.out", "w") as f:
    for line in result:
 
        f.write(line + "\n")
  for line in result:
      f.write(line + "\n")
</syntaxhighlight>

Versiunea curentă din 11 ianuarie 2024 18:15

Cerința

Fie n un număr natural. Să se determine toate posibilitățile de alegere a semnelor + și - pentru care n = (+|-) 12 + (+|-) 22 + ... + (+|-) n2

Date de intrare

Fișierul de intrare plusminus.in conține pe prima linie numărul n.

Date de ieșire

Fișierul de ieșire plusminus.out va conține pe fiecare linie o succesiune de n semne + sau - , separate prin câte un spațiu, reprezentând câte o soluție a problemei. Dacă nu există soluție, atunci fișierul de ieșire va conține pe prima linie mesajul IMPOSIBIL.

Restricții și precizări

1 ≤ n ≤ 23 șirurile se vor afișa în ordine lexicografica; caracterul - este considerat mai mic decăt caracterul + ==Exemplu==: plusminus.in

9 plusminus.out

- - + - + - + + - + - - + - - + - + + + - - + + - - + + + + + - + - - +

Explicație

Sunt 4 posibilități: 1) 9 = -12 – 22 + 32 – 42 + 52 – 62 + 72 + 82 – 92 2) 9 = +12 – 22 – 32 + 42 – 52 – 62 + 72 – 82 + 92 3) 9 = +12 + 22 – 32 – 42 + 52 + 62 – 72 – 82 + 92 4) 9 = +12 + 22 + 32 + 42 – 52 + 62 – 72 – 82 + 92

Rezolvare

def solve_plus_minus(n, signs, current_sum, current_expression, result):

   if len(current_expression) == n:
       if current_sum == 0:
           result.append(" ".join(current_expression))
       return
   for sign in signs:
       new_sum = current_sum + sign * (current_expression[-1] + 1) ** 2
       if new_sum <= n:
           solve_plus_minus(n, signs, new_sum, current_expression + [sign], result)

def plus_minus(n):

   signs = [-1, 1]  # -1 pentru minus, 1 pentru plus
   result = []
   # Inițial, începem cu primul termen, care este întotdeauna un plus
   solve_plus_minus(n, signs, 1, [1], result)
   if not result:
       result.append("IMPOSIBIL")
   return result
Citim input-ul

with open("plusminus.in", "r") as f:

   n = int(f.readline().strip())
Calculăm rezultatul

result = plus_minus(n)

Scriem rezultatul în fișierul de ieșire

with open("plusminus.out", "w") as f:

   for line in result:
       f.write(line + "\n")