0147 - expresie1
La ora de matematică Georgică a învăţat să evalueze expresii aritmetice. Pentru a verifica acest lucru profesorul de informatică îi propune lui Georgică să evalueze expresii aritmetice de forma:
A o1 B o2 C
Unde A
, B
, C
sunt operanzi, iar o1
şi o2
sunt operatori.
Valorile permise operanzilor pot fi numai termeni din şirul x1
, x2
, …, xn
, iar operatorii pot fi numai caracterele +
(adunare) şi *
(înmulţire).
Profesorul îi pune la dispoziție lui Georgică o valoare numerică V
şi îi cere să determine valorile operanzilor A
, B
şi C
pentru care expresia are valoarea V
.
Cerinţă[edit | edit source]
Scrieţi un program, care pentru V
, n
, x1
, x2
, …, xn
şi o1
, o2
date, determină indicii corespunzători termenilor din şirul x1
, x2
, …, xn
ce corespund valorilor operanzilor A
, B
şi C
pentru ca expresia dată să aibă valoarea V
.
Date de intrare[edit | edit source]
Fişierul de intrare input.txt
conţine pe prima linie numerele naturale V
, n
, x1
, x2
, …, xn
separate între ele printr-un spaţiu şi pe linia a doua exact două caractere asociate operatorilor o1
şi o2
.
Date de ieşire[edit | edit source]
Fişierul de ieşire output.txt
va conţine, pe prima linie separate între ele exact trei indici ai şirului x1
, x2
, …, xn
corespunzători termenilor folosiţi pentru A
, B
, C
. Dacă nu există soluţie se va scrie în fişier cifra 0
de trei ori separată prin câte un spaţiu: 0 0 0
.
Restricţii şi precizări[edit | edit source]
0 < n < 10001
Exemplul 1[edit | edit source]
input.txt:
100 5 40 13 2 11 20
+*
output.txt:
5 3 1
Explicație:
A = x5
, B = x3
, C = x1
Expresia devine 20 + 2 * 40 = 100
Exemplul 2[edit | edit source]
input.txt:
100 9999999999999 40 13 2 11 20
+*
Output:
Input-ul nu convine conditiilor
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def verificare(n):
if not(1<=n<=10000): print("Input-ul nu convine conditiilor") exit()
def cit():
global V, n, f, o1, o2 with open("input.txt", "r") as fin: l=list(map(int, fin.readline().split())) V = l[0] n = l[1] verificare(n) f = [0] * 1005 for i in range(1, n + 1): k = l[i+1] f[k] = i l=fin.readline() o1 = l[0] o2 = l[1]
def evalexp(A, B):
global V, o1, o2 if o1 == '+': if o2 == '+': t = V - (A + B) else: t = (V - A) / B else: if o2 == '+': t = V - A * B else: t = V / (A * B) if t > 0 and t == int(t): return int(t) return -1
def rezolva():
global f for iA in range(1001): if f[iA] > 0: for iB in range(1001): if f[iB] > 0: iC = evalexp(iA, iB) if 0 <= iC < 1001 and f[iC] > 0: with open("output.txt", "w") as fout: fout.write(f"{f[iA]} {f[iB]} {f[iC]}") return 1 return 0
def main():
cit() if rezolva() == 0: with open("output.txt", "w") as fout: fout.write("0 0 0")
if __name__ == "__main__":
main()
</syntaxhighlight>