1760 - Optim

From Bitnami MediaWiki

Gigel primea de la mama lui, ca temă, o foaie pe care era scris un şir de N numere întregi. Singurul calcul pe care ştia să îl facă până acum era suma tuturor numerelor. Pentru aceasta el plasa N-1 semne de adunare, +, între numerele aflate pe poziţii consecutive în şir şi calcula astfel suma acestor numere. Între timp a crescut şi a învăţat şi operaţia de înmulţire pentru care foloseşte semnul *. Din şirul celor N-1 semne de adunare, îi trece prin minte să înlocuiască K semne + cu K semne *.

Îşi dă seama că tema se complică, deoarece înmulţirile trebuie efectuate înaintea adunărilor, dar nu se dă bătut şi duce calculul până la capăt.

Cerința[edit | edit source]

Scrieţi un program care să determine valoarea minimă pe care o poate obţine şi valoarea maximă pe care o poate obţine după înlocuirea menţionată.

Date de intrare[edit | edit source]

Fişierul de intrare optimIN.txt conţine pe prima linie numerele naturale N şi K, separate printr-un spaţiu, reprezentând numărul de numere întregi din şir, respectiv numărul de operaţii de înmulţire ce vor fi efectuate. Pe cea de a doua linie se află N numere întregi separate prin câte un spaţiu, , reprezentând numerele din şir.

Date de ieșire[edit | edit source]

Fişierul de ieşire optimOUT.txt va conţine pe o singură linie, separate printr-un spaţiu, în ordine crescătoare, cele două valori cerute. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

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

  • 2 ≤ N ≤ 30
  • 0 ≤ K ≤ 9; K < N
  • -8 ≤ xi ≤ 8, 1 ≤ i ≤ N

Exemplu 1:[edit | edit source]

optimIN.txt

6 3
2
0
3
-1
7
-4

optimOUt.txt

-31 86

Explicație[edit | edit source]

2 * 0 + 3 * (-1) + 7 * (-4) = -31

2 + 0 + 3 * (-1) * 7 * (-4) = 86.

Exemplu 2:[edit | edit source]

optimIN.txt

6 8
2
0
3
-1
7
-4

optimOUt.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1"> def verificare_restrictii(N, K, A):

   if not (2 <= N <= 30) or not (0 <= K <= 9) or not (K < N):
       return False
   if not all(-8 <= x <= 8 for x in A):
       return False
   return True

def back(lv, k, aux, suma, A, N):

   global maxim, minim
   if lv == N:
       suma += aux
       if suma > maxim:
           maxim = suma
       if suma < minim:
           minim = suma
       return
   if N - lv > k:
       back(lv + 1, k, A[lv], suma + aux, A, N)
   if k > 0:
       back(lv + 1, k - 1, aux * A[lv], suma, A, N)

def main():

   global maxim, minim
   
   with open("optimIN.txt", "r") as fin:
       N, K = map(int, fin.readline().strip().split())
       A = [int(fin.readline().strip()) for _ in range(N)]
   
   if not verificare_restrictii(N, K, A):
       with open("optimOUT.txt", "w") as fout:
           fout.write("Datele nu corespund restrictiilor impuse\n")
       return
   
   maxim = -2000000000
   minim = 2000000000
   
   back(1, K, A[0], 0, A, N)
   
   with open("optimOUT.txt", "w") as fout:
       fout.write(f"{minim} {maxim}\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>