这是个凸包题,不怎会啊。网上找了个比较容易理解的

但是有点问题啊。就是有个测试结果不对尽然也AC了。挺郁闷的。

(毕竟还是比较容易理解的)

代码:

View Code
 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 }

 

posted on 2012-10-06 10:18  xinmenghuairi  阅读(241)  评论(0编辑  收藏  举报