您的位置:首页 > 其它

nyoj952最大四边形

2015-09-26 23:58 302 查看


最大四边形

时间限制: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息