hdu 4709 Herding

来源:互联网 发布:笛子软件 编辑:程序博客网 时间:2024/05/19 13:09

http://acm.hdu.edu.cn/showproblem.php?pid=4709

思路:方法一: 叉积求面积,在三角形ABC中向量AB=( x2-x1, y2-y1 ),向量AC=( x3-x1, y3-y1 )

AB X AC=1/2 *[ (x2-x1) *(y3-y1)-(y2-y1)*(x3-x1) ]

方法二:海伦公式,通过向量不共线来确定三角形。

方法一:

#include<iostream>#include<stdio.h>#include<math.h>using namespace std;double X[128];double Y[128];double ff(int i,int j,int k){    return fabs(X[i]*Y[j]+Y[i]*X[k]+X[j]*Y[k]-X[k]*Y[j]-X[j]*Y[i]-X[i]*Y[k])/2;}int main(){    int T;    int N;    int i,j,k;    double a,b,c;    double S;    double area;    double mi_area;    scanf("%d",&T);    while(T--){        scanf("%d",&N);        for(i=0;i<N;++i){            scanf("%lf%lf",&X[i],&Y[i]);        }        area=0;        mi_area=-1;        for(i=0;i<N;++i){            for(j=i+1;j<N;++j){                for(k=j+1;k<N;++k){                        area=ff(i,j,k);                        //printf("%lf\n",area);                    if(area!=0){                        if(area<mi_area||mi_area<0){                            mi_area=area;                        }                    }                }            }        }        if(mi_area<0){            printf("Impossible\n");        }        else{            printf("%.2f\n",mi_area);        }    }    return 0;}

方法二:

#include<iostream>#include<stdio.h>#include<math.h>using namespace std;#define F 1e-17double X[128];double Y[128];int main(){    int T;    int N;    int i,j,k;    double a,b,c;    double S;    double area;    double mi_area;    scanf("%d",&T);    while(T--){        scanf("%d",&N);        for(i=0;i<N;++i){            scanf("%lf%lf",&X[i],&Y[i]);        }        mi_area=-1;        for(i=0;i<N;++i){            for(j=i+1;j<N;++j){                for(k=j+1;k<N;++k){                    if(   fabs(   (X[j]-X[i])  *  (Y[k]-Y[i]) -  (X[k]-X[i]) * (Y[j]-Y[i])   ) < F   )                        continue;                    a=sqrt((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j]));                    b=sqrt((X[i]-X[k])*(X[i]-X[k])+(Y[i]-Y[k])*(Y[i]-Y[k]));                    c=sqrt((X[j]-X[k])*(X[j]-X[k])+(Y[j]-Y[k])*(Y[j]-Y[k]));                    S=(a+b+c)/2;                    area=sqrt(S*(S-a)*(S-b)*(S-c));                    if(area<mi_area||mi_area<0)                    {                        mi_area=area;                    }                }            }        }        if(mi_area<0){            printf("Impossible\n");        }        else{            printf("%.2f\n",mi_area);        }    }    return 0;}

0 0