zju

    技术2026-08-08  8

    // 这道题虽然是个模板题,但还是纠结了很久,主要原因是在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;

    }

     

     

    最新回复(0)