2034 - Archpsod
Context
Vrăjitorul Arpsod s-a plictisit groaznic așa că s-a gândit să își cheme prietenii (vrăjitori din regatele vecine) la un joc. Deoarece nu crede în “noroc”, Arpsod i-a provocat la tir cu arcul. Câștigătorul va fi cel ce va avea distanța maximă între două săgeți aflate pe țintă
Cerinţa
Arpsod vă roagă să faceți un program care, pentru un număr N cunoscut de trageri și poziția fiecărei săgeți pe țintă, determină distanța maximă dintre două săgeți.
Date de intrare
În fișierul archpsodin.txt, pe prima linie, se va afla numărul natural N, reprezentând numărul de trageri. Pe fiecare din următoarele N linii, se află două numere întregi x și y, reprezentând coordonatele săgeților pe țintă.
Date de ieșire
În fișierul archpsodout.txt, pe prima și singura linie se va afișa un număr real reprezentând distanța maximă dintre două săgeți. Răspunsul este considerat corect dacă diferența față de răspunsul oficial este mai mică de 10-6.
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu respecta cerintele impuse." , iar daca se indeplinesc, se afiseaza mesajul "Datele de intrare respecta cerintele impuse."
Restricţii şi precizări
- 2 ≤ N ≤ 100.000
- -1.000 ≤ x, y ≤ 1.000
- Se garantează că toate cele N săgeți sunt pe țintă.
- Coordonatele planului sunt carteziene
- Originea planului este considerată centrul țintei.
Exemplul 1
- Intrare
2 2 2 -1 -2
- Ieșire
Datele de intrare respecta cerintele impuse. 5.0000
Exemplul 2
- Intrare
5 -4 1 -100 0 0 4 2 -3 2 300
- Ieșire
Datele de intrare respecta cerintele impuse. 316.865902
Explicatie
În exemplul al doilea, distanța maximă este dată de punctele (-100, 0) și (2, 300)
Exemplul 3
- Intrare
1 2 3
- Ieșire
Datele de intrare nu respecta cerintele impuse.
Rezolvare
<syntaxhighlight lang="python" line> import math
def distanta_euclidiana(p1, p2):
return math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)
def distanta_maxima_sagetilor(N, sageți):
distanta_maxima = 0.0
for i in range(N): for j in range(i + 1, N): distanta = distanta_euclidiana(sageți[i], sageți[j]) distanta_maxima = max(distanta_maxima, distanta)
return distanta_maxima
- Citire date de intrare
try:
with open("archpsodin.txt", "r") as f: N = int(f.readline().strip()) sageți = [tuple(map(float, f.readline().strip().split())) for _ in range(N)]
# Verificare dacă datele respectă cerințele impuse if 2 <= N <= 100000 and all(-1000 <= x <= 1000 and -1000 <= y <= 1000 for x, y in sageți): # Afisare mesaj inainte de rezolvare with open("archpsodout.txt", "w") as f: f.write("Datele de intrare respecta cerintele impuse.\n") f.write(f"{distanta_maxima_sagetilor(N, sageți):.6f}\n") else: with open("archpsodout.txt", "w") as f: f.write("Datele de intrare nu respecta cerintele impuse.")
except Exception as e:
print(f"O eroare a apărut: {e}")
</syntaxhighlight>