这是个凸包题,不怎会啊。网上找了个比较容易理解的
但是有点问题啊。就是有个测试结果不对尽然也AC了。挺郁闷的。
(毕竟还是比较容易理解的)
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<algorithm> 3 #include<math.h> 4 using namespace std; 5 struct point 6 { 7 double x,y; 8 }; 9 point p[50000],res[50000]; 10 double area(point t0,point t1,point t2)//三点构成的三角形面积 11 { 12 return abs(t0.x*t1.y+t1.x*t2.y+t2.x*t0.y-t0.y*t1.x-t1.y*t2.x-t2.y*t0.x)/2; 13 } 14 double dist(point p1,point p2)//计算两点间的面积 15 { 16 return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); 17 } 18 bool multi(point p0,point p1,point p2)//判断是否凸边 19 { 20 return (p1.x-p0.x)*(p2.y-p0.y)>(p2.x-p0.x)*(p1.y-p0.y); 21 } 22 int cmp(point a,point b)//将点排序 23 { 24 if(a.y!=b.y) 25 return a.y<b.y; 26 if(a.y==b.y&&a.x!=b.x) 27 return a.x<b.x; 28 } 29 int main() 30 { 31 int i,j,k,len,n; 32 while(cin>>n) 33 { 34 for(i=0;i<n;i++) 35 cin>>p[i].x>>p[i].y; 36 sort(p,p+n,cmp); 37 res[0]=p[0]; 38 res[1]=p[1]; 39 int top=1; 40 for(i=2;i<n;i++) 41 { 42 while(top&&multi(p[i],res[top],res[top-1])) 43 top--; 44 res[++top]=p[i]; 45 } 46 len=top; 47 res[++top]=p[n-2]; 48 for(i=n-3;i>=0;i--) 49 { 50 while(top!=len&&multi(p[i],res[top],res[top-1])) 51 top--; 52 res[++top]=p[i]; 53 }//前面两个for是找到凸边 54 double max=0,s; 55 for(i=0;i<top-2;i++)//在凸边中找最大面积 56 for(j=i+1;j<top-1;j++) 57 for(k=j+1;k<top;k++) 58 { 59 s=area(res[i],res[j],res[k]); 60 if(max<s) 61 max=s; 62 } 63 printf("%.2lf\n",max); 64 } 65 return 0; 66 }