2020 - Error
Cerința[edit | edit source]
Dorel trebuie să repare reţeaua de alimentare cu apă din oraşul lui. Pentru fiecare din cele n străzi Dorel şi-a notat două numere naturale, raportul lor fiind lungimea conductei care trebuie înlocuită pe acea stradă. Pentru a destrăma mitul “Dorel, instalatorul dezastru”, el vă roagă să aflaţi lungimea totală a conductei de care are nevoie pentru a repara toate străzile, cu 20 de zecimale exacte.
Date de intrare[edit | edit source]
Fișierul de intrare errorin.txt conține pe prima linie numărul n, iar pe următoarele n linii câte două numere naturale nenule reprezentând numărătorul, respectiv numitorul raportului ce reprezintă lungimea conductei ce trebuie înlocuită pe strada respectivă.
Date de ieșire[edit | edit source]
Fișierul de ieșire errorout.txt va conține pe prima linie primele 20 de zecimale ale lungimii totale a conductei, despărţite prin spaţiu.
Restricții și precizări[edit | edit source]
- 1 ≤ n ≤ 100.000
- numerele notate de Dorel sunt naturale, nenule şi mai mici decât 1000
- pentru fiecare zecimală corectă, începând de la virgulă, se primeşte câte 1p ( dacă o zecimală e greşită, pentru următoarele după ea nu se mai acordă puncte)
Exemplu:[edit | edit source]
errorin.txt
1
7 5
errorout.txt
4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Explicație[edit | edit source]
7/5=1,40000000000000000000…
Rezolvare[edit | edit source]
<syntaxhighlight lang="python"> def citeste_date():
with open("errorin.txt", "r") as infile: n = int(infile.readline()) if not (1 <= n <= 100000): raise ValueError("Numărul de teste trebuie să fie între 1 și 100.000")
date = [] for _ in range(n): a, b = map(int, infile.readline().split()) if not (1 <= a < 1000) or not (1 <= b < 1000): raise ValueError("Numerele trebuie să fie naturale, nenule și mai mici decât 1000") date.append((a, b)) return n, date
def calculeaza_resturi_si_transport(n, date):
c = [0] * 31 for a, b in date: r = a % b for j in range(1, 31): c[j] += (r * 10) // b r = (r * 10) % b return c
def efectueaza_transport_si_scrie_rezultatul(c):
t = 0 for j in range(30, 0, -1): r = (c[j] + t) % 10 t = (c[j] + t) // 10 c[j] = r
with open("errorout.txt", "w") as outfile: for j in range(1, 21): outfile.write(f"{c[j]} ")
def main():
try: n, date = citeste_date() c = calculeaza_resturi_si_transport(n, date) efectueaza_transport_si_scrie_rezultatul(c) except ValueError as e: print(f"Eroare la citirea datelor: {e}")
if __name__ == "__main__":
main()
</syntaxhighlight>