Cod sursa(job #2403370)

Utilizator MarutBrabete Marius Stelian Marut Data 11 aprilie 2019 14:46:00
Problema Rubarba Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const double eps=1e-8;
const double PI = 2.0 * acos(0.0);
struct POINT
{
    int x,y;
};
vector<POINT>v;
double ans(double ang)
{
    double sinus=sin(ang);
    double cosinus=cos(ang);
    double xprim,yprim,xmin,ymin,xmax,ymax;
    xmin=xmax=1.0*v[0].x*cosinus+v[0].y*sinus;
    ymin=ymax=1.0*(-1.0)*(v[0].x*sinus)+v[0].y*cosinus;
    for(register int i=1;i<v.size();i++)
    {
        xprim=1.0*v[i].x*cosinus+v[i].y*sinus;
        yprim=1.0*(-1.0)*(v[i].x*sinus)+v[i].y*cosinus;
        xmin=min(xmin,xprim);
        ymin=min(ymin,yprim);
        xmax=max(xmax,xprim);
        ymax=max(ymax,yprim);
    }
    return 1.0*(ymax-ymin)*(xmax-xmin);
}
int main()
{
    freopen("rubarba.in","r",stdin);
    freopen("rubarba.out","w",stdout);
    int n,x,y,xmin,xmax,ymin,ymax;
    POINT temp;
    scanf("%d",&n);
    for(register int i=1;i<=n;i++)
    {
        scanf("%d%d",&x,&y);
        temp.x=x;
        temp.y=y;
        v.push_back(temp);
        xmin=min(xmin,x);
        ymin=min(ymin,y);
        xmax=max(xmax,x);
        ymax=max(ymax,y);
    }
    double st=0,dr=2.0*PI,med,arietrecuta=1.0*(xmax-xmin)*(ymax-ymin),arie;
    while(dr-st>=eps)
    {
        med=(st+dr)/ 2.0;
        arie=ans(med);
        if(arie-ans(med+eps)<eps) dr=med-eps;
            else st=med+eps;
    }
    med=(st+dr)/2.0;
    printf("%lf",min(ans(med),min(ans(med-eps),ans(med+eps))));
    return 0;
}