4 - Okrnjen trougao
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
1000ms | 128MB |
Dok je prenosio veliki stakleni trougao Cimi je za trenutak izgubio ravnotežu te je treće teme trougla udarilo o pod (primetiti da kako Cimi ima samo dve ruke mogao je u jedinici vremena da drži samo \(2\) temena velikog staklenog trougla). Od nekada velikog staklenog trougla ostao je jedan stakleni mnogougao koji je Cimiju ostao u rukama dok se ostatak stakla pri kontaktu sa tlom razbio u neupotrebljivo male komadiće. Cimiju je ovaj događaj bio izuzetno zanimljiv i želi da o njemu razgovara sa ostalim radnicima ali razmišlja da malo izmeni priču kako bi umanjio štetu koju je napravio, koja se izražava u površini stakla koja je sada neupotrebljiva. Pomozite Cimiju time što ćete mu za dati prost mnogougao (ne obavezno konveksan) reći kolika je minimalna razlika u površinama između njega i trougla koji ga sadrži a sa njim deli bar jednu stranicu.
Opis ulaza
U prvoj liniji standardnog ulaza nalazi se ceo broj \(n\) koji predstavlja broj temena mnogougla. U narednih \(n\) linija standardnog ulaza nalaze se po dva cela broja \(x_i, y_i\) koji predstavljaju koordinate temena mnogougla. (Uzastupna temena kao i prvo i poslednje dele stranicu)
Opis izlaza
U jedinom redu standardnog izlaza napisati realan broj koji predstavlja minimalnu razliku definisanu u tekstu zadatka. Ukoliko ne postoji ni jedan trougao koji odgovara opisu ispisati \(-1\).
Primer 1
Ulaz
Izlaz
Primer 2
Ulaz
Izlaz
Objašnjenje primera
U \(1\). primeru optimalno je odabrati trougao sa koordinatama temena \((0,0)\), \((5,0)\) i \((0,5)\).
U \(2\). primeru optimalno je odabrati trougao sa koordinatama temena \((0,0)\), \((2,0)\) i \((1,7)\).
Ograničenja
- \(3 \leq n \leq 10^5\).
- \(-10^9 \leq x_i, y_i \leq 10^9\).
- U 50% primera važi \(n \leq 1000\).
Napomena
Ukoliko ne postoji traženi trougao, vaš program mora ispisati ceo broj \(-1\). U suprotnom, ako je vaš program ispisao broj \(a\), a rešenje komisije je realan broj \(b\), vaše rešenje se prihvata kao tačno pod uslovom da važi \(\frac{|a-b|}{b} \leq 10^{-6}\) ili važi \(|a-b| \leq 10^{-6}\).
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Nikola Spasić | Ivan Stošić i Nikola Spasić | Nikola Spasić | Andrej Ivašković |
Posmatrajmo neki trougao \(T\) koji zadovoljava uslove zadatka. Kako trougao \(T\) sadrži dati mnogougao \(M\), a \(T\) je konveksan skup, važiće i \(K \subseteq T\), gde je \(K\) konveksni omotač mnogougla \(M\), jer je \(K\) po definiciji najmanji konveksan skup koji sadrži \(M\). Dakle, u zadatku se traži da za dati mnogougao nađemo trougao najmanje površine koji sadrži njegov konveksni omotač, sa dodatnim ograničenjem da neka stranica trougla bude jednaka nekoj stranici datog mnogougla, neka je to stranica \(BC\).
Temena \(B, C\) moraju biti susedna temena u konveksnom omotaču, jer se u suprotom stranica trougla nalazi u strogoj unutrašnjosti konveksnog omotača pa ga trougao ne može sadržati. Iz prethodno rečenog proizilazi da konveksni omotač i trougao imaju zajedničku stranicu. Posmatrajmo sada neku stranicu \(BC\) konveksnog omotača. Pretpostavićemo da naš trougao baš tu stranicu deli sa \(K\). Kako nam treba trougao minimalne površine njegove preostale stranice moraju imati isti pravac kao i stranice koje su susedne stranici \(BC\), neka su to stranice \(AB, CD\). Stoga za svaku stranicu konveksnog omotača treba proveriti da li se produžeci susednih strana \(AB, CD\) seku sa odgovarajuće strane i da li je stranica \(BC\) konveksnog omotača ujedno i stranica mnogougla, što nam je dovoljno da zaključimo da postoji trougao sa odgovarajućim svojstvima. Zatim, nalazimo presek pravih \(E = AB \cap CD\) i to je treća tačka našeg trougla. Sada znamo sva temena trougla, odredimo površinu a zatim i razliku površina između njega i početnog mnogougla.
Smernice za algoritam
Zbog načina na koji su data temena mnogougla možemo u linearnom vremenu naći konveksni omotač. (videti članak na Vikipediji). Površina trougla kome znamo koordinate može se dobiti kao polovina intenziteta vektorskog proizvoda dve njegove stranice (odnosno odgovarajućih vektora). Označena površina nekonveksnog mnogougla može se naći kao zbir označenih površina proizvoljnog razbijanja tog mnogougla na trouglove - videti link. Dalje, potrebno je naći površinu trougla \(BCE\) gde je \(E\) presek pravih \(AB\) i \(CD\). U teoriji, ovo se može uraditi nalaženjem jednačina te dve prave i rešavanjem sistema od dve jednačine sa dve nepoznate, a zatim primenom gore pomenute formule za površinu trougla. Međutim, problem nastaje zbog upotrebe tipa double za predstavljanje koeficijenata i rešenja ove jednačine. Srećom, postoji daleko jednostavniji način za nalaženje površine trougla \(BCE\). Važi sledeća jednakost: \(P(BCE) = \frac{P(ABC) P(BCD)}{P(BCF)}\), gde je \(F\) tačka dobijena pomeranjem tačke \(D\) za vektor \(CB\), što se može relativno lako dokazati alatima elementarne geometrije.
04_okrnjen_trougao.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
|