Potrebno je ograditi čuvenu “Oblast 42” električnom ogradom. Detaljnom analizom terena utvrđene su tačke na koje je moguće postaviti stubove za ogradu. Ograda treba da opaše najveću moguću površinu u okviru “Oblasti 42”. Pošto je pomenuta oblast u pustinji, postoji samo jedna tačka u blizini odakle je moguće dovesti struju u ogradu. Pronaći koordinate stuba ograde koji je najbliži tački dovoda struje.
Sa standardnog ulaza se učitava broj stubova \(n\) (\(3 \leq n \leq 10^4\)). Nakon toga se za svaki od \(n\) stubova u svom redu učitavaju celobrojne vrednosti \(x\ y\), koje predstavljaju koordinate stuba u koordinatnom sistemu sa jedinicom metar. Nakon toga se učitavaju celobrojne vrednosti \(a\) i \(b\) koje predstavljaju koordinate tačke dovoda struje.
Na standardni izlaz ispisati koordinate stuba koji učestvuje u ogradi, a najbliži je tački dovoda struje.
8 1 2 2 5 3 -1 5 3 6 3 3 2 5 6 3 4 4 3
6 3
U ovom bloku se opisuje glavno rešenje zadatka.
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
struct Point {
int x;
int y;
};
Point source, best;
int orientation(Point p, Point q, Point r)
{
int val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
if (val == 0)
return 0;
return (val > 0) ? 1 : 2;
}
double dist(Point p, Point q){
return sqrt((p.x-q.x)*(p.x-q.x) + (p.y-q.y)*(p.y-q.y));
}
void convexHull(vector<Point> &points, int n) {
if (n < 3)
return ;
int l = 0;
for (int i = 1; i < n; i++)
if (points[i].x < points[l].x)
l = i;
int p = l, q;
double best_dist = dist(source, points[p]);
best = points[p];
do {
q = (p + 1) % n;
for (int i = 0; i < n; i++)
if (orientation(points[p], points[i], points[q]) == 2)
q = i;
if(dist(points[q], source) < best_dist){
best_dist = dist(points[q], source);
best = points[q];
}
p = q;
} while (p != l);
}
int main() {
int N;
cin >> N;
vector<Point> points(N);
for(int i = 0; i < N; i++)
cin >> points[i].x >> points[i].y;
cin >> source.x >> source.y;
convexHull(points, N);
cout << best.x << " " << best.y << endl;
return 0;
}