RoNgDaZhOnG

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <cstdlib>
 7 #define maxn 0x3f3f3f3f
 8 using namespace std;
 9 int minn,minx,miny;
10 struct pointt{
11     int x,y;
12     bool friend operator<(const pointt a,const pointt b){
13         int xa=a.x-minx,ya=a.y-miny;
14         int xb=b.x-minx,yb=b.y-miny;
15         return((xa*yb<xb*ya)||(xa*yb==xb*ya&&xa*xa+ya*ya>xb*xb+yb*yb));
16     }
17 };
18 pointt p[2000];
19 int len,n,d;
20 float ans;
21 int stack[2000];
22 void print()
23 {
24      freopen("convex.out","w",stdout);
25      for(int i=len-1;i>=0;i--){
26              cout<<p[stack[i]].x<<" "<<p[stack[i]].y<<endl;
27      }
28      fclose(stdout);
29 }
30 void check()
31 {
32     if(len<2) return;
33     int x1=p[stack[len]].x-p[stack[len-1]].x;
34     int y1=p[stack[len]].y-p[stack[len-1]].y;
35     int x2=p[stack[len-1]].x-p[stack[len-2]].x;
36     int y2=p[stack[len-1]].y-p[stack[len-2]].y;
37     if(x1*y2==x2*y1){
38         if(x1*x2+y1*y2>0) {stack[len-1]=stack[len];len--;}
39         else{len--;}
40         check();
41     }
42     if((x1*y2-x2*y1<0)){stack[len-1]=stack[len];len--;check();}       
43 }     
44 int main(){
45     scanf("%d%d",&n,&d);
46     ans=2*3.1415926535897*d;
47     miny=maxn;minx=maxn;
48     minn=0;
49     for(int i=0;i<n;i++){
50         scanf("%d%d",&p[i].x,&p[i].y);
51         if(p[i].y<miny){
52             miny=p[i].y;
53             minx=p[i].x;
54             minn=i;
55             continue;
56         }
57         if(p[i].y==miny&&p[i].x<minx){
58             minx=p[i].x;
59             miny=p[i].y;
60             minn=i;
61             continue;
62         }
63     }
64     int num=1;
65     pointt tmp=p[minn];
66     p[minn]=p[0];
67     p[0]=tmp;
68     sort(p+1,p+n);
69         p[n]=p[0];
70 
71     stack[0]=0;
72     stack[1]=1;
73     len=1;
74     for(int i=2;i<=n;i++){
75         stack[++len]=i;
76         check();                             
77     }
78     for(int i=0;i<len;i++){
79         ans+=sqrt(float((p[stack[i+1]].x-p[stack[i]].x)*(p[stack[i+1]].x-p[stack[i]].x)+
80               (p[stack[i+1]].y-p[stack[i]].y)*(p[stack[i+1]].y-p[stack[i]].y)));
81     }
82 
83   
84    printf("%.0f\n",ans);
85     return 0;
86 }

注意:一定要记住点排序时要把 相对距离 作为第二关键字排序,不然会WA。

posted on 2017-03-06 19:24  学无止境-1980  阅读(81)  评论(0编辑  收藏  举报