枚举对边,。。边左右两边得点是单方向动的。。就是旋转卡壳辣
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 2010;
const double eps = 1e-8;
int n,stack[maxn],top;
struct Tpoint{
double x;
double y;
}list[maxn];
int dblcmp(double p){
if(fabs(p)<eps) return 0;
return p>0?1:-1;
}
double Cross(Tpoint p0, Tpoint p1, Tpoint p2) {
return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
bool cmp(Tpoint p1, Tpoint p2){
if(p1.y == p2.y) return p1.x < p2.x;
return p1.y < p2.y;
}
void Graham(){
top = 1;
for(int i = 0 ; i <= 2; i++) stack[i] = i;
for(int i = 2;i < n;i++){
while(top && dblcmp(Cross(list[stack[top-1]], list[stack[top]],list[i])<= 0)){
top--;
}
stack[++top] = i;
}
int len = top;
stack[++top] = n-2;
for(int i = n-3; i >= 0 ; i--){
while(top!=len && dblcmp(Cross(list[stack[top-1]], list[stack[top]],list[i])<= 0)) top--;
stack[++top] = i;
}
// for(int i = 0; i <= top ; i++){
// printf("x = %f y = %f\n",list[stack[i]].x,list[stack[i]].y);
// }
}
void init(){
for(int i=0 ; i < n ; i++ )
scanf("%lf%lf",&list[i].x,&list[i].y);
memset(stack,0,sizeof(stack));
sort(list, list+n, cmp);
}
double dis(int a,int b){
return (list[stack[a]].x-list[stack[b]].x)*(list[stack[a]].x-list[stack[b]].x) + (list[stack[a]].y-list[stack[b]].y)*(list[stack[a]].y-list[stack[b]].y);
}
void sov(){
double ans = 0;
for(int i = 0 ; i <= top ; i++){
int l = i+1 ,r = i+3;
for(int j = i+2 ; j <= top ; j++){
//cout <<"i = "<< i <<" j = "<< j <<endl;
//cout <<"df "<< Cross(list[stack[i]],list[stack[(l+1)%top]],list[stack[j]]) <<" "<<Cross(list[stack[i]],list[stack[l]],list[stack[j]])<<endl;
while( fabs(Cross(list[stack[i]],list[stack[(l+1)%top]],list[stack[j]]) )> fabs(Cross(list[stack[i]],list[stack[l]],list[stack[j]]))){
l = (l+1)%top ;
if(l == j) break;
}
//cout << "llll = "<< l <<endl;
// cout <<"df "<< Cross(list[stack[i]],list[stack[(r+1)%top]],list[stack[j]]) <<" "<<Cross(list[stack[i]],list[stack[r]],list[stack[j]])<<endl;
while( fabs(Cross(list[stack[i]],list[stack[(r+1)%top]],list[stack[j]])) > fabs(Cross(list[stack[i]],list[stack[r]],list[stack[j]]))){
r = (r+1)%top ;
if(r == i) break;
}
// cout <<"asd "<<l<<" "<<r <<" "<<Cross(list[stack[i]],list[stack[l]],list[stack[j]]) <<" "<<Cross(list[stack[i]],list[stack[r]],list[stack[j]])<<endl;
// if(l != r)
ans = max(ans,fabs(Cross(list[stack[i]],list[stack[l]],list[stack[j]])) + fabs(Cross(list[stack[i]],list[stack[r]],list[stack[j]])));
}
}
printf("%.3f\n",ans/2.0);
}
int main(){
while(~scanf("%d",&n)){
if(n < 4){
printf("0.00\n");
continue;
}
init();
Graham();
sov();
}
}