1754 - Munți
Sursa: [1]
Cerinţa
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
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
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
- 1 ⩽ N ⩽ 1.000.000
- 1 ⩽ înalțimea inițială ⩽ 1.000.000.000
Exemplul 1
- Intrare
- munti.in
- 4
- 2 6 2 2
- Ieșire
- Datele introduse corespund cerintelor.
- munti.out
- 4
Exemplul 2
- Intrare
- munti.in
- 8
- 2 6 2 2
- Ieșire
- Datele introduse corespund cerintelor.
- munti.out
- 7
Rezolvare
<syntaxhighlight lang="python" line>
- 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
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.