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。