Iahub has drawn a set of n points in the cartesian plane which he calls "special points". A quadrilateral is a simple polygon without self-intersections with four sides (also called edges) and four vertices (also called corners). Please note that a quadrilateral doesn't have to be convex. A special quadrilateral is one which has all four vertices in the set of special points. Given the set of special points, please calculate the maximal area of a special quadrilateral.
Input
The first line contains integer n (4 ≤ n ≤ 300). Each of the next n lines contains two integers: xi, yi ( - 1000 ≤ xi, yi ≤ 1000) — the cartesian coordinates of ith special point. It is guaranteed that no three points are on the same line. It is guaranteed that no two points coincide.
Output
Output a single real number — the maximal area of a special quadrilateral. The answer will be considered correct if its absolute or relative error does't exceed 10 - 9.
Examples
Input
5 0 0 0 4 4 0 4 4 2 3
Output
16.000000
Note
In the test example we can choose first 4 points to be the vertices of the quadrilateral. They form a square by side 4, so the area is 4·4 = 16.
题解:求4个点组成4边形的面积最大
题解:枚举任意两个点,形成一条线,求两边组成最大三角形的和
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=300+11;
#define eps 1e-10
int n;
struct node{
double x,y;
}a[N];
int main()
{
while(~scanf("%d", &n)) {
for(int i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y);
double ans = 0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
double up = 0, down = 0;
double l=fabs(a[i].y - a[j].y);
for(int k=1;k<=n;k++)
{
if(k==i||k==j) continue;
double x1 = a[i].x-a[j].x,y1=a[i].y-a[j].y;
double x2 = a[i].x-a[k].x,y2=a[i].y-a[k].y;
double s = x1*y2 - x2*y1;
if(s < 0) up = max(up, -s / 2);
if(s > 0) down = max(down, s / 2);
}
if(up > 0 && down > 0) ans = max(ans, up + down);
}
}
if(ans<=eps) printf("-1\n");
else printf("%.10f\n",ans);
}
return 0;
}