计算凸包周长和一个圆的周长
#include<iostream> #include<stdio.h> #include<string.h> #include<string> #include<stdlib.h> #include<cmath> #include<queue> #include<algorithm> using namespace std; #define rd(x) scanf("%d",&x) #define rdd(x,y) scanf("%d%d",&x,&y) #define rddd(x,y,z) scanf("%d%d%d",&x,&y,&z) #define rdddd(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w) #define rds(s) scanf("%s",s) #define rep(i,n) for(int i=0;i<n;i++) #define LL long long const int N = 1e5+10; const int M=2000; const int inf=0x3f3f3f3f; const double eps=1e-9; int MOD=1e9+7; int cas=1; int n,m,k,q,L; int sgn(double x){return x<-eps?-1:x<eps?0:1;} struct Point{ double x,y; Point(){} Point(double _x,double _y){ x=_x;y=_y; } }; double cross(Point a,Point b,Point c){ return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); } bool same(Point a,Point b){ if(sgn(a.x-b.x)==0 && sgn(a.y-b.y)==0) return true; return false; } double dist(Point a,Point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } Point p[1005],convex[1005]; int mi; bool cmp(Point a,Point b){ int ret=sgn(cross(p[0],a,b)); if(ret==0) return dist(p[0],a)<dist(p[0],b); return ret>0; } int graham(){ int top=0; convex[top++]=p[0]; convex[top++]=p[1]; int k=2; while(k<=n){ while(top>=2 && sgn(cross(convex[top-2],p[k%n],convex[top-1]))>=0) top--; convex[top++]=p[k%n]; k++; } return top; } double pi=acos(-1.0); int main() { #ifndef ONLINE_JUDGE freopen("aaa","r",stdin); #endif int T; rdd(n,L); mi=1; for(int i=0;i<n;i++){ scanf("%lf%lf",&p[i].x,&p[i].y); if(sgn(p[mi].y-p[i].y)>0 || sgn(p[mi].y-p[i].y)==0 && sgn(p[mi].x-p[i].x)>0) mi=i; } swap(p[0],p[mi]); sort(p+1,p+n,cmp); // } int num=graham(); double ans=0; for(int i=1;i<num;i++){ ans+=dist(convex[i-1],convex[i]); } ans+=2*pi*L; printf("%.0f\n",ans); return 0; }