2020 - Error

From Bitnami MediaWiki

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>