zoukankan      html  css  js  c++  java
  • poj 1113 凸包 虽然A了 但补来补去,代码已经惨不忍睹了

    题目描述:http://poj.org/problem?id=1321

    典型的凸包 ,求凸包周长再加上一个圆的周长

    注意:输出时别用%.lf  原因:http://bbs.byr.cn/#!article/ACM_ICPC/45379

    32ms 

    如果你想研究者道题的话还是绕道吧,看一下那些大牛的代码把

    #include <stdio.h>
    #include <stdlib.h>
    #include<math.h>
    struct a
    {
    int x;
    int y;
    double an;
    };
    int si=-1;
    void push(struct a a[],struct a s)
    {
    si+=1;
    a[si]=s;
    }
    struct a pop(struct a a[])
    {
    si-=1;
    return a[si+1];
    }
    struct a top1(struct a a[])
    {
    return a[si];
    }
    struct a top2(struct a a[])
    {
    return a[si-1];
    }

    int one(struct a a[],int p,int r)
    {
    int i,j;
    struct a temp,x;
    x=a[r];
    i=p-1;
    for(j=p;j<=r-1;j++)
    {
    if(a[j].an<=x.an)
    {
    i+=1;
    temp=a[i];
    a[i]=a[j];
    a[j]=temp;
    }

    }
    temp=a[i+1];
    a[i+1]=a[r];
    a[r]=temp;
    return i+1;
    }
    void quicksort(struct a a[],int p,int r )
    {
    int q;
    if(p<r)
    {
    q=one(a,p,r);
    quicksort(a,p,q-1);
    quicksort(a,q+1,r);
    }
    }

    int main(int argc, char** argv) {

    int n,i,i1,k,z,temi,yx=100000,j,j1;
    double maxx=-100000,maxy=-100000,sum;
    struct a zb[1050],zb1[1050],temp,to1,to2,tm;
    scanf("%d %d",&n,&z);
    for(i=0;i<n;i++)
    {
    scanf("%d %d",&zb[i].x,&zb[i].y);

    if(maxy<zb[i].y)
    {
    maxy=zb[i].y;
    maxx=zb[i].x;
    temi=i;
    }
    else if(maxy==zb[i].y)
    {
    if(zb[i].x>maxx)
    {
    maxx=zb[i].x;
    temi=i;
    }
    }
    }
    //angle
    temp=zb[n-1];
    zb[n-1]=zb[temi];
    zb[temi]=temp;
    --n;

    for(i=0;i<n;i++)
    {
    if((zb[i].x-zb[n].x)!=0)
    {
    zb[i].an=(zb[i].y-zb[n].y)*1.0/(zb[i].x-zb[n].x);
    }
    else
    {
    zb[i].an=100000;
    }
    }
    quicksort(zb,0,n-1);
    zb1[0]=zb[0];
    k=0;
    for(i=1;i<n;i++)
    {
    if(zb[i].an==zb1[k].an)
    {

    if((zb[i].x-zb[n].x)*(zb[i].x-zb[n].x)+(zb[i].y-zb[n].y)*(zb[i].y-zb[n].y)>(zb1[k].x-zb[n].x)*(zb1[k].x-zb[n].x)+(zb1[k].y-zb[n].y)*(zb1[k].y-zb[n].y))
    {
    zb1[k]=zb[i];
    }

    }
    else
    {
    k++;
    zb1[k]=zb[i];
    }
    }
    if(k>=1)
    {
    //judge
    for(i=0;i<=k;i++)
    if(zb1[i].an>=0.0)
    break;
    if(i==k+1)
    {
    i=0;
    }
    tm=zb[n];
    push(zb,tm);
    push(zb,zb1[i]);
    for(j=i+1;j<=k+i;j++)
    {
    to1=top1(zb);
    to2=top2(zb);
    j1=j%(k+1);
    while((zb1[j1].x-to1.x)*(to1.y-to2.y)-(to1.x-to2.x)*(zb1[j1].y-to1.y)>0)
    {
    pop(zb);
    to1=top1(zb);
    to2=top2(zb);
    }
    push(zb,zb1[j1]);
    }
    sum=0;
    for(i=0;i<si;i++)
    {

    sum+=sqrt((zb[i].x-zb[i+1].x)*(zb[i].x-zb[i+1].x)+(zb[i].y-zb[i+1].y)*(zb[i].y-zb[i+1].y));
    }

    sum+=sqrt((zb[si].x-zb[0].x)*(zb[si].x-zb[0].x)+(zb[si].y-zb[0].y)*(zb[si].y-zb[0].y));
    //sum+=sqrt((zb[0].x-tm.x)*(zb[0].x-tm.x)+(zb[0].y-tm.y)*(zb[0].y-tm.y));
    printf("%.f\n",(sum+3.141592653*z*2));
    }
    else
    {

    printf("%.f\n",(2*sqrt((zb[n].x-zb1[k].x)*(zb[n].x-zb1[k].x)+(zb[n].y-zb1[k].y)*(zb[n].y-zb1[k].y))+3.141592653*2*z));

    }
    return (EXIT_SUCCESS);
    }



  • 相关阅读:
    mybatis逆向工程使用
    shiro凭证配置
    shiro基于ini文件入门案例
    springboot实现自定义mvc组件
    ssm整合activiti配置文件和依赖
    activiti网关分支设置
    HTML5新特性 websocket(重点)--多对多聊天室
    HTML5新特性--svg-echarts(重点)-拖动API-WebWorker
    HTML5新特性-- -定时器
    HTML新特性--canvas绘图-文本
  • 原文地址:https://www.cnblogs.com/fengyuehan/p/poj1113.html
Copyright © 2011-2022 走看看