1754 - Munți

From Bitnami MediaWiki

Sursa: [1]

Cerinţa[edit]

Vrăjitorul vă cere să determinați numărul maxim de munți ce pot fi aduși la o înălțime egală.

Date de intrare[edit]

Pe prima linie a fișierului munti.in se va afla numărul natural N, reprezentând numărul de munți existenți. Pe cea de-a doua linie se vor afla N valori naturale separate prin spațiu, reprezentând înălțimea inițială a fiecărui munte.

Date de ieșire[edit]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele introduse corespund cerintelor.", apoi fișierul de ieșire munti.out va conține, pe prima și singura linie a fișierului, numărul maxim de munți ce pot fi aduși la o înălțime egală. În cazul în care datele nu respectă restricțiile, se va doar afișa pe ecran: "Datele introduse nu corespund cerintelor."

Restricţii şi precizări[edit]

  • 1 ⩽ N ⩽ 1.000.000
  • 1 ⩽ înalțimea inițială ⩽ 1.000.000.000

Exemplul 1[edit]

Intrare
munti.in
4
2 6 2 2
Ieșire
Datele introduse corespund cerintelor.
munti.out
4


Exemplul 2[edit]

Intrare
munti.in
8
2 6 2 2
Ieșire
Datele introduse corespund cerintelor.
munti.out
7

Rezolvare[edit]

<syntaxhighlight lang="python" line>

  1. 1754

def validate_input(n, x_list):

   if not 1 <= n <= 1000000 or not all(1 <= x <= 1000000000 for x in x_list):
       print("Datele introduse nu corespund cerintelor.")
       exit()


def read_input_file(file_path):

   with open(file_path, "r") as f_in:
       n = int(f_in.readline())
       x_list = list(map(int, f_in.readline().split()))
   return n, x_list


def write_output_file(file_path, result):

   with open(file_path, "w") as f_out:
       f_out.write(str(result))


def calculate_result(n, x_list):

   s = sum(x_list)
   return n if s % n == 0 else n - 1


if __name__ == "__main__":

   input_file = "munti.in"
   output_file = "munti.out"
   try:
       n, x_list = read_input_file(input_file)
       validate_input(n, x_list)
       result = calculate_result(n, x_list)
       write_output_file(output_file, result)
       print("Datele introduse corespund cerintelor.")
   except ValueError as e:
       print(str(e))
   except FileNotFoundError:
       print("Fisierul de intrare nu exista.")
   except Exception as e:
       print("A aparut o eroare: " + str(e))


</syntaxhighlight>

Explicatie rezolvare[edit]

Acest program are ca scop citirea unui fișier de intrare, validarea datelor, efectuarea unui calcul și scrierea rezultatului într-un fișier de ieșire.

Funcția `validate_input` primește doi parametri: `n` și `x_list`. Această funcție verifică dacă `n` este între 1 și 1.000.000 și dacă toate elementele din `x_list` sunt între 1 și 1.000.000.000. Dacă această validare nu este îndeplinită, se afișează un mesaj de eroare și programul se încheie.

Funcția `read_input_file` primește calea către un fișier de intrare și returnează două valori: `n` și `x_list`. Ea deschide fișierul de intrare și citește prima linie, care reprezintă `n`. Apoi citește a doua linie și o împarte în elemente întregi, pe care le stochează într-o listă `x_list`. Cele două valori sunt returnate ca rezultat.

Funcția `write_output_file` primește calea către un fișier de ieșire și un rezultat. Ea deschide fișierul de ieșire și scrie rezultatul convertit la șir de caractere.

Funcția `calculate_result` primește `n` și `x_list` și efectuează un calcul pentru a obține rezultatul. Calculează suma tuturor elementelor din `x_list` și verifică dacă această sumă este divizibilă cu `n`. Dacă este, rezultatul este egal cu `n`, altfel rezultatul este egal cu `n - 1`. Rezultatul calculat este returnat.

În cadrul blocului `if __name__ == "__main__":`, se specifică fișierul de intrare și fișierul de ieșire. Se încearcă citirea datelor din fișierul de intrare folosind `read_input_file`, validarea datelor cu `validate_input`, calcularea rezultatului cu `calculate_result`, scrierea rezultatului în fișierul de ieșire folosind `write_output_file`, și se afișează un mesaj de confirmare dacă totul a fost realizat cu succes.

Dacă apar excepții în timpul execuției (cum ar fi valori invalide în fișierul de intrare sau fișierul de intrare lipsă), se afișează un mesaj corespunzător.