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