标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8996 Accepted Submission(s):
3457
点我
1 #include <iostream> 2 #include <algorithm> 3 #include <cmath> 4 #include <cstdio> 5 #include <cstring> 6 using namespace std; 7 struct point 8 { 9 int x,y; 10 }list[100]; 11 int stack[100]; 12 int cross(point p0,point p1,point p2) 13 { 14 return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x); 15 } 16 double dis(point p1,point p2) 17 { 18 return sqrt(double(p2.x-p1.x)*(p2.x-p1.x)+double(p2.y-p1.y)*(p2.y-p1.y)); 19 } 20 bool cmp(point p1,point p2) 21 { 22 int tem=cross(list[0],p1,p2); 23 if(tem>0) 24 return 1; 25 else if(tem==0&&dis(list[0],p1)<dis(list[0],p2)) 26 return 1; 27 else 28 return 0; 29 } 30 void init(int n) 31 { 32 int i,k; 33 point p0; 34 cin>>list[0].x>>list[0].y; 35 for(i=1;i<n;i++) 36 { 37 cin>>list[i].x>>list[i].y; 38 if(list[i].y<list[0].y||(list[i].y==list[0].y&&list[i].x<list[0].x)) 39 { 40 p0=list[0]; 41 list[0]=list[i]; 42 list[i]=p0; 43 } 44 } 45 sort(list+1,list+n,cmp); 46 } 47 int main() 48 { 49 int i,n; 50 //freopen("in.txt","r",stdin); 51 while(cin>>n&&n) 52 { 53 memset(list,0,sizeof(list)); 54 memset(stack,0,sizeof(stack)); 55 if(n==1) 56 cout<<0.00<<endl; 57 else if(n==2) 58 { 59 cin>>list[0].x>>list[0].y>>list[1].x>>list[1].y; 60 printf("%0.2f\n",dis(list[0],list[1])); 61 } 62 else 63 { 64 stack[0]=0; 65 stack[1]=1; 66 int top=1; 67 init(n); 68 for(i=2;i<n;i++) 69 { 70 while(top>0&&cross(list[stack[top]],list[stack[top-1]],list[i])>0) 71 top--; 72 top++; 73 stack[top]=i; 74 } 75 double sum=0; 76 for(i=1;i<=top;i++) 77 { 78 sum+=dis(list[stack[i]],list[stack[i-1]]); 79 } 80 sum+=dis(list[0],list[stack[top]]); 81 printf("%0.2f\n",sum); 82 } 83 } 84 }
标签:
原文地址:http://www.cnblogs.com/a1225234/p/4814590.html