最大四边形
时间限制:
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
上传者
通常方法是枚举四个点就好。
可是这样会超时,用一种简单方法,就是用两层循环枚举四边形的对称轴,再用一层循环枚举一个点,判断这个点四边形的左边还是右边,分别算出这个对称轴左半部分和右半部分最大的面积。相加就是最大的,注意左半部分和右半部分的面积不能是0,排除是三角形的情况
ac代码
#include<stdio.h> #include<string.h> struct s { double x,y; }p[350]; double maxx(double a,double b) { if(a>b) return a; else return b; } double muti(struct s a,struct s b,struct s c) { return ((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y))*0.5; } int main() { int n; while(scanf("%d",&n)!=EOF) { double ans=0,rmax=0,lmax=0; int i,j,k; for(i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { rmax=0; lmax=0; for(k=0;k<n;k++) { if(k!=i&&k!=j) { double s=muti(p[i],p[j],p[k]); if(s<0) lmax=maxx(lmax,-s); else rmax=maxx(rmax,s); } } if(lmax!=0&&rmax!=0) ans=maxx(ans,lmax+rmax); } } printf("%.6lf\n",ans); } }
-
有多组测试数据