1、题目链接:http://codeforces.com/problemset/problem/340/B
2、这道题是纯计算几何,因为我完全没有学过,比赛的时候临时抱佛脚,自然是WA一片。赛后发现问题在于:我虽然枚举了四个点,也知道四边形面积的计算公式,但是那只有在四个点是顺时针给出或者逆时针给出的时候计算结果才正确,因为我是随机枚举的,所以很可能顺序是乱的,自然WA。
3、正确的方法是枚举“对角线”,这有点像Floyd算法,然后枚举除了这个对角线外的所有点,注意,必须确保两边都有点,否则0 0,0 5,5,0,1,1这组数据通不过。(正确答案是10,但输出12.5)。找出最左边和最右边的点,算两个三角形面积,然后相加,求出一系列结果中最大的那个即可。
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct Point{
double x,y;
Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;
const double eps=1e-10;
int dcmp(double x){
if(fabs(x)<eps) return 0;else return x<0?-1:1;
}
Vector operator - (Point A,Point B){return Vector(A.x-B.x,A.y-B.y);}
double Cross(Vector A,Vector B){return A.x*B.y-A.y*B.x;}
Point a[310],p[4];
int main(){
//freopen("a.txt","r",stdin);
int n;
double ans,temp,l,r;
while(scanf("%d",&n)==1){
ans=0.0;
for(int i=0;i<n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++){
l=r=0.0;
for(int k=0;k<n;k++){
temp=Cross(a[i]-a[k],a[j]-a[k]);
if(temp>0)
r=max(r,temp);
else
l=max(l,-temp);
}
if(dcmp(min(l,r))==0) continue;
else
ans=max(ans,(l+r)/2);
}
printf("%lf\n",ans);
}
return 0;
}