poj 1113 Wall 凸包
1 /** 2 大意:给定点,求将这些点包起来的,最小周长,,形成的凸包与点之间的需要有一定的距离l; 3 思路: 1、求出凸包 4 2、求凸包中的长度+ 弧形的长度----〉即一个圆的周长: 因为形成的多边形的内角是360 所以因为距离l所形成的弧的角度相加即为360.。也就是一个圆的周长。。 5 值得学习:对于四舍五入。(int)(ans+ 0.5) 7 8 **/ 9 /#include <iostream> 10 #include <algorithm> 11 #include <cmath> 12 using namespace std; 13 const int maxn = 1050; 14 const double pi = acos(-1.0); 15 const double eps = 1e-8; 16 int dcmp(double x){ 17 if(fabs(x)<eps) return 0; 18 else 19 return x<0?-1:1; 20 } 21 int n; 22 struct point{ 23 double x,y; 24 point (double x=0,double y=0):x(x),y(y){} 25 }; 26 point p[maxn]; 27 point ch[maxn]; 28 typedef point Vector; 29 Vector operator - (point a , point b){ 30 return Vector (a.x-b.x,a.y-b.y); 31 } 32 33 double cross(Vector a,Vector b){ 34 return a.x*b.y-a.y*b.x; 35 } 36 double length(Vector a){ 37 return sqrt(a.x*a.x+a.y*a.y); 38 } 39 bool cmp(point a ,point b){ 40 if(a.x==b.x) 41 return a.y<b.y; 42 return a.x<b.x; 43 } 44 int convexHull(point *p,int n,point *ch){ // 凸包求法。 45 //cout<<"--------------->"<<endl; 46 sort(p,p+n,cmp); 47 // for(int i=0;i<n;i++) 48 // cout<<p[i].x<<" "<<p[i].y<<endl; 49 int m =0; 50 for(int i=0;i<n;i++){ 51 while(m>1&&dcmp(cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<=0) 52 m--; 53 ch[m++] = p[i]; 54 } 55 int k= m; 56 for(int i=n-2;i>=0;i--){ 57 while(m>k&&dcmp(cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<=0) 58 m--; 59 ch[m++] = p[i]; 60 } 61 //cout<<m<<endl; 62 if(n>1) m--; 63 return m; 64 } 65 66 int main() 67 { 68 int n,l; 69 cin>>n>>l; 70 for(int i=0;i<n;i++){ 71 cin>>p[i].x>>p[i].y; 72 } 73 int res = convexHull(p,n,ch); 74 //for(int i=0;i<res;i++) 75 // cout<<ch[i].x<<" "<<ch[i].y<<endl; 76 double ans =0; 77 for(int i=0;i<res-1;i++){ 78 ans += length(ch[i+1]-ch[i]); 79 } 80 ans += length(ch[res-1]-ch[0]); 81 //cout<<ans<<endl; 82 ans += pi*l*2; 83 cout<<(int )(ans+0.5)<<endl; 84 return 0; 85 }