Cod sursa(job #2285143)

Utilizator FrostfireMagirescu Tudor Frostfire Data 18 noiembrie 2018 11:06:46
Problema Infasuratoare convexa Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <algorithm>
#include <iostream>
#include <iomanip>

using namespace std;

ifstream f("infasuratoare.in");
ofstream g("infasuratoare.out");

int n,poz,vf,stiva[120500];

struct punct{
  double x,y;
}v[120500],p;

int mycmp(punct p1, punct p2)
{
    int val = (p2.x - v[1].x) * (p1.y - v[1].y) - (p2.y - v[1].y) * (p1.x - v[1].x);
    if(val <=0) return 1;
    return 0;
}

int position(punct p1, punct p2, punct p3)
{
    int val = (p3.x - p1.x) * (p2.y - p1.y) - (p3.y - p1.y) * (p2.x - p1.x);
    if(val <=0) return 1;
    return 0;
}
int main()
{
    f>>n;
    p.x = p.y = 1000000003;
    for(int i = 1; i<=n ; i++) { f>>v[i].x>>v[i].y;
                                 if(v[i].x < p.x || v[i].x == p.x && v[i].y < p.y) {
                                    p.x = v[i].x;
                                    p.y = v[i].y;
                                    poz = i;
                                 }
                               }
    swap(v[1],v[poz]);
    //for(int i = 1; i<=n; i++) g<<v[i].x<<' '<<v[i].y<<'\n';

    sort(v + 2, v + n + 1, mycmp);

    //for(int i = 1; i<=n; i++) g<<v[i].x<<' '<<v[i].y<<'\n';

    stiva[++vf] = 1;
    stiva[++vf] = 2;
    stiva[n+1] = n+1;
    for(int i = 3; i<=n; i++)
    {
        if(position(v[stiva[vf-1]],v[stiva[vf]],v[i])) stiva[++vf] = i;
          else
          {
              stiva[vf] = i;
          }
    }
    g<<vf<<setprecision(6)<<fixed<<'\n';
    for(int i = 1; i<=vf ; i++) g<<setprecision(6)<<v[stiva[i]].x<<' '<<setprecision(6)<<v[stiva[i]].y<<'\n';
    return 0;
}