Cod sursa(job #1120937)

Utilizator olarasuloredanaOlarasu Loredana olarasuloredana Data 25 februarie 2014 10:50:09
Problema Infasuratoare convexa Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
ifstream f("infasuratoare.in");
ofstream g("infasuratoare.out");
int n,poz,s[120001],k;
double minx,miny;
typedef struct{double x,y,panta;}PUNCT;
#define oo 1000000;
PUNCT v[120001],aux;
int convex(int i)
{
    PUNCT a,b,c;
    double S;
    a=v[s[k-1]];
    b=v[s[k]];
    c=v[i];
    S =(a.x-c.x)*(b.y-a.y)+(a.x-b.x)*(a.y-c.y) ;
    if(S>0) return 1;
    return 0;
}
int main()
{
    f>>n;
    int i,ok;
    minx=miny=oo;
    for(i=1;i<=n;i++)
    {
        f>>v[i].x>>v[i].y;

        if(v[i].x<minx||v[i].x==minx&&v[i].y<miny)
        {
            minx=v[i].x;
            miny=v[i].y;
            poz=i;
        }
    }
    aux=v[1];
    v[i]=v[poz];
    v[poz]=aux;
    for(i=2;i<=n;i++)

        v[i].panta=(v[i].y-miny)/(v[i].x-minx);
    do
    {
        ok=0;
        for(i=2;i<n;i++)
              if(v[i].panta>v[i+1].panta||v[i].panta==v[i+1].panta&&v[i].x>v[i+1].x)
        {
            aux=v[i];
            v[i]=v[i+1];
            v[i+1]=aux;
            ok=1;
        }

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

}