Cod sursa(job #2503949)

Utilizator CatalinaPHOVornicu Catalina-Cristina CatalinaPHO Data 3 decembrie 2019 23:12:54
Problema Infasuratoare convexa Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <iomanip>
#include <algorithm>
#define nmax 120010
#define inf 1<<30
using namespace std;
int i,n,k,s[nmax],poz;
struct punct
{
    double x,y,panta;
}v[nmax],o,aux;
int cmp(punct a,punct b)
{
    if(a.panta==b.panta)
        return a.x<b.x;
    return a.panta<b.panta;
}
int convex()
{
    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()
{
    ifstream f("infasuratoare.in");
    ofstream g("infasuratoare.out");
    f>>n;
    o.x=o.y=inf;
    for(i=1;i<=n;i++)
    {
        f>>v[i].x>>v[i].y;
        if(v[i].x<o.x||v[i].x==o.x&&v[i].y<o.y)
            o=v[i],poz=i;
    }
    aux=v[1];
    v[1]=v[poz];
    v[poz]=aux;
    for(i=2;i<=n;i++)
        v[i].panta=(v[i].y-o.y)/(v[i].x-o.x);
    sort(v+2,v+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)<<v[s[i]].x<<" "<<fixed<<setprecision(6)<<v[s[i]].y<<"\n";
    return 0;
}