0152 - Sir: Difference between revisions

From Bitnami MediaWiki
Andrada378 (talk | contribs)
Pagină nouă: == Enunț == GM are un şir de N numere naturale a1 , a2 ,…, aN , cu proprietatea ai ≤ ai+1 ≤ 2*ai pentru orice i, 1 ≤i < N. El doreşte să scrie în faţa fiecărei valori din şir un semn + sau - astfel încât valoarea S a expresiei obţinute să aibă proprietatea 0 ≤ S ≤ a1 . == Cerinţa == Scrieţi un program care să-l ajute pe GM să determine un mod de a scrie cele N semne. == Date de intrare == Pe prima linie a fişierului de intrare sir.in se află n...
 
Andrada378 (talk | contribs)
 
Line 35: Line 35:
<syntaxhighlight lang="python">
<syntaxhighlight lang="python">
def validate_input(N, values):
def validate_input(N, values):
     if not (1 <= N <= 100000):
     if not (1 <= N <= 100000 and (N <= 18 or 1 <= all(1 <= val <= 10**9 for val in values))):
         print("Eroare: N trebuie să fie între 1 și 100000.")
         print("Eroare: Date de intrare nevalide.")
         return False
         return False
    if N <= 18 and not (N <= 18):
        print("Eroare:  N trebuie să fie mai mic sau egal cu 18.")
        return False
    if len(values) != N:
        print("Eroare: Numărul de valori nu corespunde cu N.")
        return False
    for val in values:
        if not (1 <= val <= 10**9):
            print(f"Eroare: Valoarea {val} nu este în intervalul permis.")
            return False
     return True
     return True



Latest revision as of 16:23, 3 January 2024

Enunț[edit | edit source]

GM are un şir de N numere naturale a1 , a2 ,…, aN , cu proprietatea ai ≤ ai+1 ≤ 2*ai pentru orice i, 1 ≤i < N. El doreşte să scrie în faţa fiecărei valori din şir un semn + sau - astfel încât valoarea S a expresiei obţinute să aibă proprietatea 0 ≤ S ≤ a1 .

Cerinţa[edit | edit source]

Scrieţi un program care să-l ajute pe GM să determine un mod de a scrie cele N semne.

Date de intrare[edit | edit source]

Pe prima linie a fişierului de intrare sir.in se află numărul natural N reprezentând numărul de valori din şir. Pe următoarea linie se află numerele a1 , a2 ,…, aN , separate prin câte un spaţiu.

Date de ieşire[edit | edit source]

Fişierul de ieşire sir.out va avea o singură linie ce va conţine un şir de N caractere + sau -. Al i-lea caracter va reprezenta semnul ce va fi scris în faţa valorii ai .

Restricţii şi precizări[edit | edit source]

  • 1 ≤ N ≤ 100.000
  • 1 ≤ ai ≤ 109
  • Dacă există mai multe soluţii se va afişa oricare dintre ele
  • Pentru un număr de teste în valoare de 30 de puncte, N ≤ 18

Exemplu[edit | edit source]

sirin.txt

3

2 3 5

sirout.txt

--+

Explicaţii[edit | edit source]

Se obţine expresia S=-2-3+5=0, care respectă proprietatea cerută (0 ≤ S ≤ 2).

Rezolvare[edit | edit source]

<syntaxhighlight lang="python"> def validate_input(N, values):

   if not (1 <= N <= 100000 and (N <= 18 or 1 <= all(1 <= val <= 10**9 for val in values))):
       print("Eroare: Date de intrare nevalide.")
       return False
   return True

def solve_signs(N, values):

   signs = [] * N
   signs[-1] = '+'
   for i in range(N - 2, -1, -1):
       if values[i] * 2 >= values[i + 1]:
           signs[i] = '-'
       else:
           signs[i] = '+'
   return .join(signs)

with open('sirin.txt', 'r') as file:

   N = int(file.readline().strip())
   values = list(map(int, file.readline().split()))


if not validate_input(N, values):

   exit()

result = solve_signs(N, values)

with open('sirout.txt', 'w') as file:

   file.write(result + '\n')

if __name__ == "__main__":

   solve_signs(N, values)

</syntaxhighlight>