Cod sursa(job #1144703)

Utilizator serbanSlincu Serban serban Data 17 martie 2014 14:43:49
Problema Infasuratoare convexa Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <iomanip>

using namespace std;

int n,last2,last1,S[120010],K;
double Z,minx=2000000000,miny=2000000000,ma,ta;
struct kt{
double x,y,tg;
};
kt v[120010];
int cmp(kt pp, kt qq)
{
    return pp.tg>qq.tg;
}
int calcul(int aa,int bb,int cc)
{
    return (v[aa].x-v[cc].x)*(v[bb].y-v[cc].y)-(v[aa].y-v[cc].y)*(v[bb].x-v[cc].x);
}
int main()
{
    int i,j;
    FILE *f=fopen("infasuratoare.in","r");
    FILE *g=fopen("infasuratoare.out","w");
    fscanf(f,"%d",&n);
    for(i=1;i<=n;i++)
    {
        fscanf(f,"%lf%lf",&v[i].x,&v[i].y);
        if(minx>v[i].x)
        {
            minx=v[i].x;
            miny=v[i].y;
            j=i;
        }
        else if(minx==v[i].x)
            if(miny>v[i].y)
            {
                miny=v[i].y;
                j=i;
            }
    }
    v[j]=v[n];
    for(i=1;i<n;i++)
    {
        v[i].x-=minx;
        v[i].y-=miny;
        v[i].tg=atan2(v[i].y,v[i].x);
    }
    sort(v+1,v+n,cmp);
    v[0].x=0;
    v[0].y=0;
    K=2;
    S[1]=0;
    S[2]=1;
    for(i=2;i<n;i++)
    {
        while(calcul(S[K-1],i,S[K])<0)
            K--;
        K++;
        S[K]=i;
    }
    fprintf(g,"%d\n",K);
    for(i=K;i>=1;i--)
        v[S[i]].x+=minx,v[S[i]].y+=miny;
    for(i=K;i>=1;i--)
        fprintf(g,"%0.13lf %0.13lf\n",v[S[i]].x,v[S[i]].y);
    return 0;
}