1865 - Summit
De la Universitas MediaWiki
Cerința
Se dă un şir x
format din n
numere naturale nenule. Pentru fiecare element xi
din şir să se verifice dacă există un număr k
astfel încât elementul xi
să fie egal cu suma primelor k
elemente din şir.
Date de intrare
Fișierul de intrare summitIN.txt
conține pe prima linie numărul n
, iar pe a doua linie n
numere naturale separate prin spații.
Date de ieșire
Fișierul de ieșire summitOUT.txt
va conține pe linia i
valoarea k
dacă elementul xi
este egal cu suma primelor k
elemente din şir, sau 0
în caz contrar, pentru fiecare i
de la 1
la n
.
Restricții și precizări
2 ≤ n ≤ 1.000.000
- numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât
2.000.000.000
Exemplul 1
summitIN.txt
3 1 2 3
summitOUT.txt
1 0 2
Exemplul 2
summitIN.txt
1 1
Numerele introduse nu respectă restricțiile.
Rezolvare
def verifica_restrictii(n, nums):
return 2 <= n <= 1000000 and all(0 < x < 2000000000 for x in nums)
def verifica_summit(n, nums):
suma_partiala = [0] # Lista pentru suma parțială, începând cu 0
for i in range(n):
suma_partiala.append(suma_partiala[-1] + nums[i])
rezultate = []
for i in range(n):
k = 0
while k < n and suma_partiala[k] < nums[i]:
k += 1
if k < n and suma_partiala[k] == nums[i]:
rezultate.append(k)
else:
rezultate.append(0)
return rezultate
def main():
with open("summitIN.txt", "r") as f:
n = int(f.readline())
nums = list(map(int, f.readline().split()))
if verifica_restrictii(n, nums):
rezultate = verifica_summit(n, nums)
with open("summitOUT.txt", "w") as f:
for rez in rezultate:
f.write(str(rez) + "\n")
else:
print("Numerele introduse nu respectă restricțiile.")
if __name__ == "__main__":
main()