hdu 4709 Herding

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-17

double 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;
}

你可能感兴趣的:(hdu 4709 Herding)