Cod sursa(job #1595361)

Utilizator ionut98Bejenariu Ionut Daniel ionut98 Data 10 februarie 2016 11:07:40
Problema Infasuratoare convexa Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream>
#include<iomanip>
#include<algorithm>
#define inf 1<<30
using namespace std;
ifstream f("infasuratoare.in");
ofstream g("infasuratoare.out");
int n,k,poz,i,fin[120005];
struct punct
{
    double x,y,panta;
}v[120005],aux,min1;
int cmp(punct nr1,punct nr2)
{
    if(nr1.panta==nr2.panta)
      return nr1.x<nr2.x;
    return nr1.panta<nr2.panta;
}
int conex()
{
    punct a,b,c;
    double arie;
    a=v[fin[k-1]];
    b=v[fin[k]];
    c=v[i];
    //arie=(a.x-c.x)*(b.y-a.y)+(a.x-b.x)*(a.y-c.y);
    arie=(a.x*b.y+b.x*c.y+a.y*c.x-c.x*b.y-c.y*a.x-a.y*b.x)/2;
    if(arie>0)
      return 1;
    return 0;
}
int main()
{
    f>>n;
    min1.x=inf;
    min1.y=inf;
    for(i=1;i<=n;i++)
    {
        f>>v[i].x>>v[i].y;
        if(v[i].x<min1.x||v[i].x==min1.x&&v[i].y<min1.y)
        {
            min1=v[i];
            poz=i;
        }
    }
    aux=v[1];
    v[1]=min1;
    v[poz]=aux;
    for(i=2;i<=n;i++)
      v[i].panta=(v[i].y-v[1].y)/(v[i].x-v[1].x);
    sort(v+2,v+n+1,cmp);
    k=2;
    fin[2]=2;
    fin[1]=1;
    for(i=3;i<=n;i++)
    {
        while(!conex()&&k>2)
          k--;
        k++;
        fin[k]=i;
    }
    g<<k<<"\n";
    for(i=1;i<=k;i++)
      g<<fixed<<setprecision(6)<<v[fin[i]].x<<" "<<fixed<<setprecision(6)<<v[fin[i]].y<<"\n";
    return 0;
}