Cod sursa(job #1133330)

Utilizator TudorMTudor Moldovanu TudorM Data 4 martie 2014 19:10:27
Problema Infasuratoare convexa Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
#include<cmath>
#include<algorithm>
#include<iomanip>
using namespace std;
ifstream f("infasuratoare.in");
ofstream g("infasuratoare.out");
int n, st[120000], k, poz;
struct punct{double x,y,panta;}c[120001],aux;
double minix=1000000, miniy=10000000;
int convex(int i)
{
    double s;
    punct a, b, d;
    a=c[st[k-1]];
    b=c[st[k]];
    d=c[i];
    s=(a.x-d.x)*(b.y-a.y)+(a.x-b.x)*(a.y-d.y) ;
    if(s>0)return 1;
    return 0;
}
int cmp(punct a, punct b)
{
    if(a.panta<b.panta||(a.panta==b.panta&&a.x<b.x))return 1;

   return 0;
}
void citire()
{
    int i, j;
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>c[i].x>>c[i].y;
        if(c[i].x<minix||(c[i].x==minix&&c[i].y<miniy))
        {
            minix=c[i].x;
            miniy=c[i].y;
            poz=i;
        }
    }
    aux=c[poz];
    c[poz]=c[1];
    c[1]=aux;
    for(i=2;i<=n;i++)c[i].panta=(c[i].y-c[1].y)/(c[i].x-c[1].x);
    sort(c+2,c+n+1,cmp);

}
int main()
{
    int i;
    citire();
    k=0;
    st[++k]=1;
    st[++k]=2;
    for(i=3;i<=n;i++)
    {
        while(k>2&&!convex(i))k--;
        st[++k]=i;
    }
    g<<k<<'\n';
    for(i=1;i<=k;i++)g<<fixed<<setprecision(6)<<c[st[i]].x<<" "<<c[st[i]].y<<'\n';
    f.close();
    g.close();
    return 0;
}