跟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);
}
}