最大四边形
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
平面坐标上有n个点,你知道能组成四边形中面积最大的是多少吗?
-
输入
-
有多组测试数据
第一行整数n,表示有n个点,( 4<=n<=300 )
然后n行,每行x,y表示点的坐标。(没有重复的点)
输出
- 最大四边形的面积.(保留六位小数) 样例输入
-
5 0 0 0 4 4 0 4 4 2 3
样例输出
-
16.000000
-
- 解题思路:枚举每条线段作为四边形的对角线然后计算线段左边最大面积直线右端最大面积相加即可
-
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #define eps 1e-10 using namespace std; struct point{ double x,y; }A[310]; int sgn(double n){ if(fabs(n)<eps)return 0; if(n<0)return -1; return 1; } double cp(point p1,point p2,point p3){ return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x); } double MAX(double a,double b){ return a>b?a:b; } int main() { int n,i,j,k; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;++i){ scanf("%lf%lf",&A[i].x,&A[i].y); } double ans=0; for(i=0;i<n;++i){ for(j=i+1;j<n;++j){//枚举边 double S,Sa=0,Sb=0; for(k=0;k<n;++k){//枚举每一个点 if(k==i||k==j)continue; double S=0.5*cp(A[i],A[j],A[k]); if(sgn(S)<0)Sa=MAX(Sa,-S); else Sb=MAX(Sb,S); } if(Sa==0||Sb==0)continue; //不能四边形 ans=MAX(ans,Sa+Sb); } } printf("%.6lf\n",ans); } return 0; }
-
有多组测试数据