Cod sursa(job #1124536)

Utilizator Barcau_EmanuelBarcau Emanuel Barcau_Emanuel Data 26 februarie 2014 12:38:31
Problema Infasuratoare convexa Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
#include<algorithm>
#include<iomanip>
using namespace std;
ifstream f("infasuratoare.in");
ofstream g("infasuratoare.out");
int i,j,n,l,k,m,poz,s[120002];

struct pie{
double x,y,tg;
}a[120002],b[120002],min1,aux;

int cmp(pie a,pie b)
{
    if(a.tg==b.tg) return a.x<b.x;
    return a.tg<b.tg;
}

int convex()
{
    pie x,y,z;
    double S;
    x=a[s[k-1]];
    y=a[s[k]];
    z=a[i];
    S=(x.x-z.x)*(y.y-x.y)+(x.x-y.x)*(x.y-z.y);
    if(S>0) return 1;
    return 0;
}

int main()
{
    f>>n;
    min1.x=min1.y=9999999;
    for(i=1;i<=n;i++)
    {
        f>>a[i].x>>a[i].y;
        if(a[i].x<min1.x) {poz=i; min1=a[i];}
        else
        if(a[i].x==min1.x)
        {
            if(a[i].y<min1.y) {poz=i; min1=a[i];}
        }
    }
    aux=a[1];
    a[1]=a[poz];
    a[poz]=a[1];

    for(i=2;i<=n;i++)
    {
        a[i].tg=(a[i].y-a[1].y)/(a[i].x-a[1].x);
    }

   sort(a+2,a+n+1,cmp);

    s[1]=1;
    s[2]=2;
    k=2;

    for(i=3;i<=n;i++)
    {
        while(!convex()&&k>2) k--;
        s[++k]=i;
    }
    g<<k<<"\n";
    for(i=1;i<=k;i++)
    {
        g<<fixed<<setprecision(6)<<a[s[i]].x<<" "<<a[s[i]].y<<"\n";
    }

    return 0;
}