Editorial for Pozar
Submitting an official solution before solving the problem yourself is a bannable offence.
Analiza
Umesto da posmatramo problem "iz perspektive kruga", nađimo za svaku pravu skup krugova imaju presek sa njom. Kako je -ti krug sadržan u narednom, ako prava seče
-ti krug, tada sigurno seče i svaki naredni, što znači da ovaj skup krugova čini segment, pritom, sufiks, niza krugova. Nađimo, dakle, za svaku pravu najmanji krug koji se seče sa njom. Iz gore izloženog zaključujemo da se ovaj krug može naći binarnom pretragom po krugovima - ako se neki krug ne seče sa pravom, nastavljamo pretragu po većim krugovima, inače, pamtimo rešenje i tražimo među manjim krugovima. Nakon što smo našli indeks
ovog najmanjeg kruga, u nizu rešenja
treba brojevima
da dodamo
, što možemo uraditi tako što dodamo
broju
a nakon što obradimo sve prave izračunamo prefiksnu sumu niza
, koju štampamo.
Smernice za algoritam
Da bismo ispitali da li se prava određena dvema tačkama seče sa krugom radijusa
sa centrom u tački
, najjednostavniji način je da nađemo udaljenost prave
do tačke
i da taj broj uporedimo sa
. Izračunajmo dvostruku površinu trougla
kao apsolutnu vrednost vektorskog proizvoda
i dužinu duži
. Kako je udaljenost prave
od
zapravo visina trougla
, tu visinu možemo izračunati preko površine:
. Pritom, sve ove operacije se mogu pouzdano izračunati pomoću tipa
double sa relativnom preciznošću što je dovoljno dobro za ovaj zadatak.
Comments