描述
平面坐标上有n个点,你知道能组成四边形中面积最大的是多少吗?
-
输入
-
有多组测试数据
第一行整数n,表示有n个点,( 4<=n<=300 )
然后n行,每行x,y表示点的坐标。(没有重复的点)
输出
- 最大四边形的面积.(保留六位小数) 样例输入
-
5 0 0 0 4 4 0 4 4 2 3
样例输出
-
16.000000
主要就是枚举 防止超时的较好
代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#define pi 1e-8
using namespace std;
int n;
struct node{
double x,y;
}p[330];
double area(node a,node b,node c)
{
return (a.x-b.x)*(c.y-b.y)-(c.x-b.x)*(a.y-b.y);
}
double judge(node a,node b)
{
double lmax=0,rmax=0;
for(int i=0;i<n;i++)
{
double tem = area(a,b,p[i]);
if(tem<pi)lmax=max(lmax,-tem);//线段两边的两点与线段的叉乘结果正负相反 max不断更新最值就好
if(tem>pi)rmax=max(rmax,tem);//
}
if(lmax==0||rmax==0)//此时a b坐标为最靠边的点。
return 0;
return (lmax+rmax)*0.5;
}
int main()
{
double ans;int i,j;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
ans=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)//for 不断循环枚举
ans=max(ans,judge(p[i],p[j]));
printf("%.6lf\n",ans);
}
return 0;
}