最大四边形
时间限制:
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
/* 多一重循环应该会超时,没有试,直接百度的。利用叉乘两边的正负值省去一重循环。加油!!! Time:2014-10-17 19:40 */ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAX 310 #define eps 1e-7 struct Point{ double x,y; }p[MAX]; double muti_cross(Point a,Point b,Point c){ return ((a.x-b.x)*(a.y-c.y)-(a.x-c.x)*(a.y-b.y))*0.5; }/* double Max(double a,double b){ if(a-b>eps)return a; return b; }*/ int main(){ int N; while(scanf("%d",&N)!=EOF){ for(int i=0;i<N;i++){ scanf("%lf%lf",&p[i].x,&p[i].y); } Point l;double lmax,rmax,s,sumArea=0; for(int i=0;i<N;i++) for(int j=i+1;j<N;j++){ lmax=0,rmax=0; for(int k=0;k<N;k++){ if(i!=k&&j!=k){ s=muti_cross(p[k],p[i],p[j]); lmax=max(lmax,s); rmax=max(rmax,-s);//因为方向相反,利用最大值求出来刚好是两边的最大值 } } if(lmax<=eps||rmax<=eps) continue;//排除三角形 sumArea=max(sumArea,lmax+rmax); } printf("%lf\n",sumArea); } return 0; }
-
有多组测试数据