zoj 3762 Pan's Labyrinth 几何+贪心

     跟n个点,在所有构成的三角形中,求最大的高。在网上看到了一种贪心的做法..虽然不确定对,但好像没找到什么反例...

首先对每个点,求出距离他最远的点,然后枚举每个点就成了枚举线段了,在枚举第三个点,记录最大的高就好了,复杂度O(n^2);

#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define pi acos(-1.0)

using namespace std;

struct Point
{
    double x, y;
    int type;
    Point(double x=0, double y=0):x(x),y(y){}
    void read(){scanf("%lf%lf",&x,&y);}
};

typedef Point Vector;


inline Vector operator + (const Vector& A,const Vector& B){return Vector(A.x+B.x, A.y+B.y);}

inline Vector operator - (const Vector& A,const Vector& B){return Vector(A.x-B.x, A.y-B.y);}

inline Vector operator * (const Vector& A,const double& p){return Vector(A.x*p, A.y*p);}

inline Vector operator / (const Vector& A,const double& p){return Vector(A.x/p, A.y/p);}

inline bool operator < (const Point& a,const Point& b)
{
    return a.x<b.x ||(a.x == b.x && a.y < b.y);
}

const double eps = 1e-8;

inline int dcmp(const double x)
{
    if(fabs(x)<eps) return 0; else return x < 0 ? -1 : 1;
}

inline bool operator == (const Point& a,const Point& b)
{
    return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0;
}

inline double Dot(const Vector& A,const Vector& B) {return A.x*B.x + A.y*B.y;}
inline double Length(const Vector& A) {return sqrt(Dot(A,A));}
inline double Cross(const Vector& A,const Vector& B) {return A.x*B.y - A.y*B.x;}

inline double dist(const Point& a,const Point& b)
{
    return (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y-b.y);
}

inline double DistanceToline(Point& P, Point& A, Point& B)
{
    Vector v1 = B - A, v2 = P - A;
    return fabs(Cross(v1, v2)) / Length(v1);
}
Point a[1010];
int far[1010];
int n;
int main()
{
//    freopen("in.txt","r",stdin);
    while( ~scanf("%d",&n))
    {
    for (int i=1; i<=n; i++)
    a[i].read();
    for (int i=1; i<=n; i++)
    {
        double dis=0;
        int id;
        for (int j=1; j<=n; j++)
        if (i!=j)
        {
            double tmp=dist(a[i],a[j]);
            if (dis<dist(a[i],a[j]))
            {
                dis=dist(a[i],a[j]);
                id=j;
            }
        }
        far[i]=id;
    }
    double ans=0.0;
    for (int i=1; i<=n; i++)
    {
        Point tp=a[far[i]];
        for (int j=1; j<=n; j++)
        if (i!=j && j!=far[i])
        {
            ans=max(ans,DistanceToline(a[i],tp,a[j]));
            ans=max(ans,DistanceToline(a[j],tp,a[j]));
            ans=max(ans,DistanceToline(tp,a[i],a[j]));
        }
    }

    printf("%.5lf\n",ans);
    }
}


你可能感兴趣的:(zoj 3762 Pan's Labyrinth 几何+贪心)