HDU 2202 计算几何

最大三角形

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对这道题目百思不得其解,想不通用什么方法来解决,因此他找到了聪明的你,请你帮他解决这个题目。
 

 

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\n");
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\n",ans/2);
96     }
97     return 0;
98 }

 

posted @ 2016-11-19 16:17  luckilzy  阅读(301)  评论(0编辑  收藏  举报