Električna ograda

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.

Opis ulaza

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.

Opis izlaza

Na standardni izlaz ispisati koordinate stuba koji učestvuje u ogradi, a najbliži je tački dovoda struje.

Primer

Ulaz

8 1 2 2 5 3 -1 5 3 6 3 3 2 5 6 3 4 4 3

Izlaz

6 3

Rešenje

Opis glavnog rešenja

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;

}