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
#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))
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.