最大三角形
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4015 Accepted Submission(s): 1433
Problem Description
老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大。
Eddy对这道题目百思不得其解,想不通用什么方法来解决,因此他找到了聪明的你,请你帮他解决这个题目。
Eddy对这道题目百思不得其解,想不通用什么方法来解决,因此他找到了聪明的你,请你帮他解决这个题目。
Input
输入数据包含多组测试用例,每个测试用例的第一行包含一个整数n,表示一共有n个互不相同的点,接下来的n行每行包含2个整数xi,yi,表示平面上第i个点的x与y坐标。你可以认为:3
<= n <= 50000 而且 -10000 <= xi, yi <= 10000.
Output
对于每一组测试数据,请输出构成的最大的三角形的面积,结果保留两位小数。
每组输出占一行。
每组输出占一行。
Sample Input
3
3 4
2 6
3 7
6
2 6
3 9
2 0
8 0
6 6
7 7
Sample Output
1.50
27.00
Author
Eddy
代码:
1 //最大三角形的顶点一定是凸包的顶点,先求凸包再三重循环用向量算最大的三角形面积。刚开始以为这样会超时竟然没有 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 using namespace std; 8 int n,top; 9 struct nod 10 { 11 double x,y; 12 }p[50004],que[50004]; 13 int xy(nod p0) 14 { 15 p0.x-=p[0].x; 16 p0.y-=p[0].y; 17 if(p0.x>=0&&p[0].y>=0) return 1; 18 if(p[0].x<=0&&p[0].y>0) return 2; 19 if(p[0].x<0&&p[0].y<=0) return 3; 20 if(p[0].x>=0&&p[0].y<0) return 4; 21 } 22 double chaji(nod p0,nod p1,nod p2) 23 { 24 return ((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x)); 25 } 26 bool cmp(nod p1,nod p2) 27 { 28 int L1=xy(p1),L2=xy(p2); 29 if(L1==L2) 30 { 31 double tem=chaji(p[0],p1,p2); 32 if(tem>0) return 1; 33 if(tem<0) return 0; 34 if(tem==0) 35 return p1.x<p2.x; 36 } 37 else return L1<L2; 38 } 39 void tubao() 40 { 41 top=0; 42 que[top].x=p[0].x;que[top++].y=p[0].y; 43 que[top].x=p[1].x;que[top++].y=p[1].y; 44 que[top].x=p[2].x;que[top].y=p[2].y; 45 for(int i=3;i<=n;i++) 46 { 47 while(chaji(que[top-1],que[top],p[i])<=0) 48 top--; 49 que[++top].x=p[i].x; 50 que[top].y=p[i].y; 51 } 52 } 53 int main() 54 { 55 while(scanf("%d",&n)!=EOF) 56 { 57 double Minx=10000007,Miny=10000007; 58 int Mini; 59 for(int i=0;i<n;i++) 60 { 61 scanf("%lf%lf",&p[i].x,&p[i].y); 62 if(p[i].y<Miny) 63 { 64 Miny=p[i].y; 65 Minx=p[i].x; 66 Mini=i; 67 } 68 else if(p[i].y==Miny&&p[i].x<Minx) 69 { 70 Minx=p[i].x; 71 Mini=i; 72 } 73 } 74 if(n==1||n==2) 75 { 76 printf("0.00 "); 77 continue; 78 } 79 double tem=p[0].x; 80 p[0].x=p[Mini].x; 81 p[Mini].x=tem; 82 tem=p[0].y; 83 p[0].y=p[Mini].y; 84 p[Mini].y=tem; 85 sort(p+1,p+n,cmp); 86 p[n].x=p[0].x;p[n].y=p[0].y; 87 tubao(); 88 double ans=0.0; 89 for(int i=0;i<=top-2;i++) 90 for(int j=i+1;j<=top-1;j++) 91 for(int k=j+1;k<=top;k++) 92 { 93 ans=max(fabs(chaji(que[i],que[j],que[k])),ans); 94 } 95 printf("%.2lf ",ans/2); 96 } 97 return 0; 98 }