1760 - Optim
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>