/*
translation:
给出n个点,求去掉一点后,再求凸包,所能得到凸包最小的面积是多少?
solution:
很容易想到去掉的点肯定在凸包上面。所以对上面的点一一枚举,然后维护最小答案即可。
note:
* 想半天只想到去掉的点肯定在凸包上,然后暴力枚举上面的每一个点。但看了下数据范围又否决了自己的方法。
但是万万没想到题解就是按照暴力来写的,这数据明显偏弱了。不然如此暴力的方法肯定TLE。
*/
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 5;
const double INF = 0x3f3f3f3f * 1.0;
struct Point
{
double x, y;
int id;
Point(){}
Point(double x_, double y_):x(x_),y(y_){}
} p[maxn], q[maxn], dup[maxn], convex[maxn];
typedef Point Vector;
int n;
Vector operator + (Vector a, Vector b) { return Vector(a.x + b.x, a.y + b.y); }
Vector operator - (Point a, Point b) { return Point(a.x - b.x, a.y - b.y); }
Vector operator * (Vector a, double p) { return Vector(a.x * p, a.y * p); }
Vector operator / (Vector a, double p) { return Vector(a.x / p, a.y / p); }
bool operator < (const Point& a, const Point& b)
{
return a.x < b.x || (a.x == b.x && a.y < b.y);
}
const double eps = 1e-10;
int dcmp(double x)
{
if(fabs(x) < eps) return 0;
else return x < 0 ? -1 : 1;
}
bool operator == (const Point& a, const Point& b)
{
return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0;
}
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
double length(Vector a) { return sqrt(dot(a, a)); }
double angle(Vector a, Vector b) { return acos(dot(a, b) / length(a) / length(b)); }
double angle(Vector v) { return atan2(v.y, v.x); }
double cross(Vector a, Vector b) { return a.x * b.y - b.x * a.y; }
double dist(Point p1,Point p2) { return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); }
double area(Point a, Point b, Point c) { return cross(b - a, c - a); }
int convexHull(Point* p, int n, Point* ch)
{
sort(p, p + n);
int m = 0;
for(int i = 0; i < n; i++) {
while(m > 1 && cross(ch[m-1] - ch[m-2], p[i] - ch[m-2]) <= 0) m--;
ch[m++] = p[i];
}
int k = m;
for(int i = n-2; i >= 0; i--) {
while(m > k && cross(ch[m-1] - ch[m-2], p[i] - ch[m-2]) <= 0) m--;
ch[m++] = p[i];
}
if(n > 1) m--;
return m;
}
double polygonArea(Point* p, int n)
{
double area = 0;
for(int i = 0; i < n-1; i++) {
area += cross(p[i] - p[0], p[i+1] - p[0]);
}
return area / 2;
}
int main()
{
//freopen("in.txt", "r", stdin);
while(~scanf("%d", &n) && n) {
for(int i = 0; i < n; i++) {
scanf("%lf%lf", &p[i].x, &p[i].y);
p[i].id = i;
}
memcpy(dup, p, n * sizeof(Point));
int m = convexHull(p, n, q);
double ans = INF;
for(int i = 0; i < m; i++) {
memcpy(p, dup, n * sizeof(Point));
p[q[i].id] = p[0];
int k = convexHull(p, n, convex);
ans = min(ans, polygonArea(convex, k));
}
printf("%.2f\n", ans);
}
return 0;
}