#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; const int X = 50001; struct node{ int x,y; friend bool operator < (node a,node b) { return a.y<b.y||(a.y==b.y&&a.x<b.x); } }res[X],p[X]; int n,top; int cross(node a,node b,node o) { return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y); } void graham() { sort(p,p+n); res[0] = p[0]; res[1] = p[1]; top = 1; for(int i=2;i<n;i++) { while(top&&cross(p[i],res[top-1],res[top])<=0) --top; res[++top] = p[i]; } int ntop = top; res[++top] = p[n-2]; for(int i=n-3;i>=0;i--) { while(top>ntop&&cross(p[i],res[top-1],res[top])<=0) --top; res[++top] = p[i]; } } void solve() { if(top<3) { printf("0.00\n"); return; } int k = 2; int ans = 0; int temp; for(int i=0;i<top;i++) { k = (i+1)%top; for(int j=i+1;j<top;j++) { while(cross(res[i],res[j],res[k+1])>(temp = cross(res[i],res[j],res[k]))) k = (k+1)%top; ans = max(ans,temp); } } printf("%.2lf\n",ans/2.0); } int main() { while(scanf("%d",&n),n!=-1) { for(int i=0;i<n;i++) scanf("%d%d",&p[i].x,&p[i].y); if(n<3) { printf("0.00\n"); continue; } graham(); solve(); } return 0; }
Triangle 两次旋转卡壳
最新推荐文章于 2012-09-05 07:22:20 发布