省选前练模板系列

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100010,inf=1e9;
const double eps=1e-11;
int dcmp(double a, double b)
{
    if (a < b - eps) return -1;
    else if (a > b + eps) return 1;
    else return 0;
}
struct vec{
    double x,y,ang;
    vec(){}; 
    vec(double a,double b){x=a,y=b;}
    vec operator-(vec a){return vec(x-a.x,y-a.y);}
    vec operator+(vec a){return vec(x+a.x,y+a.y);}
    bool operator<(const vec&p) const
    {
        return dcmp(x,p.x)<0 || (dcmp(x,p.x)==0 && y < p.y);
    }    
}p[maxn],ch[maxn];
int n,m,pp,mi,k;
double A,P;
double cross(vec a,vec b){return a.x*b.y-b.x*a.y;}
double dot(vec a,vec b){return a.x*b.x+a.y*b.y;}
double dis(vec a,vec b){return sqrt((double)dot(a-b,a-b));}
int main(){
    while(scanf("%d",&n)!=EOF&&n){
        m=0;A=1e15;P=1e15;
        for(int i=0;i<n;++i){
            scanf("%lf%lf",&p[i].x,&p[i].y);
        }
        sort(p,p+n);
        for(int i=0;i<n;++i){
            while(m>1&&cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)m--;
            ch[m++]=p[i];
        }
        k=m;
        for(int i=n-2;i>=0;--i){
            while(m>k&&cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)m--;
            ch[m++]=p[i];
        }
        if(n>1)--m;
        for(int i=0;i<m;++i)cout<<ch[i].x<<' '<<ch[i].y<<endl;
        ch[m]=ch[0];
        int t=1,l=1,r=1;
        for(int b=0;b<m;++b){
            while(cross(ch[b+1]-ch[b],ch[t+1]-ch[t])>eps)t=(t+1)%m;
            while(dot(ch[b+1]-ch[b],ch[r+1]-ch[r])>eps)r=(r+1)%m;
            if(b==0)l=(r+1)%m;
            while(dot(ch[b+1]-ch[b],ch[l+1]-ch[l])<-eps)l=(l+1)%m;
            double d=dis(ch[b+1],ch[b]);
            double h=(double)cross(ch[b+1]-ch[b],ch[t]-ch[b])/d;
            double w=(double)(dot(ch[r]-ch[b],ch[b+1]-ch[b])-dot(ch[b+1]-ch[b],ch[l]-ch[b]))/d;
            A=min(A,2*(h+w));P=min(P,h*w);
        }
        printf("%.2lf %.2lf\n",P,A);
    }
    return 0;
}
/*
*/ 

 

posted on 2018-04-04 16:16  湮灭之瞳  阅读(214)  评论(0编辑  收藏  举报