2034 - Archpsod

De la Universitas MediaWiki

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

archpsodin.txt
2
2 2
-1 -2


archpsodout.txt
 Datele de intrare respecta cerintele impuse.
 5.0000


Exemplul 2

archpsodin.txt
5
-4 1
-100 0
0 4
2 -3
2 300
archpsodout.txt
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

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}")