zju_1453_凸包

// 这道题虽然是个模板题,但还是纠结了很久,主要原因是在hdu1392上有同样的题目,可惜hdu上忽略了n=2的情况,导致一直找不出buger

#include<iostream>

#include<cstdio>

#include<cmath>

#include<algorithm>

using namespace std;

 

struct node

{

double x,y;

}a[103],stack[103],flag;

int n;

 

double dis(node a,node b)

{

return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));

}

 

int sect(node a,node b,node c)

{

return (a.x-c.x)*(b.y-c.y)<(b.x-c.x)*(a.y-c.y);

}

 

int cmp(node a,node b)

{

return sect(a,b,flag)>1e-8;

}

 

double gram()

{

int top=1;

stack[0]=a[0];

stack[1]=a[1];

int i;

for(i=2;i<n;i++)

{

while(top>0&&sect(a[i],stack[top],stack[top-1])>1e-8)top--;

stack[++top]=a[i];

}

// printf("/n");

// for(i=0;i<=top;i++)

// printf("%d %d/n",stack[i].x,stack[i].y);

// printf("/n");

double ans=dis(stack[top],stack[0]);

for(i=0;i<top;i++)

ans+=dis(stack[i],stack[i+1]);

return ans;

}

 

int main()

{

while(scanf("%d",&n)!=EOF&&n)

{

flag.x=flag.y=100000.0;

int index,i;

for(i=0;i<n;i++)

{

scanf("%lf%lf",&a[i].x,&a[i].y);

if(a[i].x<flag.x||a[i].x==flag.x&&a[i].y<flag.y)

{

index=i;

flag=a[i];

}

}

if(n==1)

{

printf("0.00/n");

continue;

}

// else if(n==2)      在zju上这一步要去掉,因为题目是用绳子围起来的长度,hdu的测试数据有有误,

// {

// printf("%.2lf/n",dis(a[0],a[1]));

// continue;

// }

a[index]=a[0];

a[0]=flag;

sort(a+1,a+n,cmp);

// printf("/n");

// for(i=0;i<n;i++)

// printf("%d %d/n",a[i].x,a[i].y);

// printf("/n");

printf("%.2lf/n",gram());

}

return 0;

}

 

 

你可能感兴趣的:(zju_1453_凸包)