首页 > 代码库 > hdu2202(最大三角形 )凸包
hdu2202(最大三角形 )凸包
最大三角形
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3184 Accepted Submission(s): 1075
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
总结:在计算面积时一定要注意三点共线的问题,一时没注意,wa好多次
1 #include<iostream> 2 #include<stdio.h> 3 #include<math.h> 4 #include<algorithm> 5 using namespace std; 6 #define N 50010 7 struct point 8 { 9 int x,y;10 double angel;11 } p[N],stack[N];12 int top,n;13 14 double dis(point a,point b)15 {16 return sqrt(double((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));17 }18 19 bool mult(point p1,point p2,point p0)20 {21 return (p1.x-p0.x)*(p2.y-p0.y) >= (p2.x-p0.x)*(p1.y-p0.y);22 }23 24 bool cmp(point a,point b)25 {26 if(a.angel == b.angel)27 {28 if (a.x == b.x)29 return a.y > b.y;30 return a.x > b.x;31 }32 return a.angel < b.angel;33 }34 35 void graham()36 {37 int i,k=0;38 for(i=0; i<n; i++)39 if(p[i].y<p[k].y||((p[i].y==p[k].y)&&(p[i].x<p[k].x)))40 k=i;41 swap(p[0],p[k]);42 for(i=1; i<n; i++)43 p[i].angel=atan2(double(p[i].y-p[0].y),double(p[i].x-p[0].x));44 sort(p+1,p+n,cmp);45 stack[0]=p[0];46 stack[1]=p[1];47 stack[2]=p[2];48 top=3;49 for(i=3; i<n; i++)50 {51 while(top > 2 && mult(stack[top-2],stack[top-1],p[i])<=0)52 top--;53 stack[top++]=p[i];54 }55 }56 57 int main()58 {59 int i,j,k;60 double ans,t,s1,s2,s3,max;61 while(scanf("%d",&n)!=EOF)62 {63 for(i=0; i<n; i++)64 scanf("%d%d",&p[i].x,&p[i].y);65 graham();66 ans=0;67 max=0;68 for(i=0; i<top-2; i++)69 for(j=i+1; j<top-1; j++)70 for(k=j+1; k<top; k++)71 {72 if(mult(stack[i],stack[j],stack[k])==0)73 continue;74 s1=dis(stack[i],stack[j]);75 s2=dis(stack[j],stack[k]);76 s3=dis(stack[k],stack[i]);77 t=(s1+s2+s3)/2;78 ans=t*(t-s1)*(t-s2)*(t-s3);79 if(ans>max)80 max=ans;81 }82 printf("%.2lf\n",sqrt(max));83 }84 return 0;85 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。