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);
    }



  • 相关阅读:
    flume sink两种类型 file_rool 自定义sing com.mycomm.MySink even if there is only one event, the event has to be sent in an array
    为什么引入进程20年后,又引入线程?
    As of Flume 1.4.0, Avro is the default RPC protocol.
    Google Protocol Buffer 的使用和原理
    Log4j 2
    统一日志 统一订单
    网站行为跟踪 Website Activity Tracking Log Aggregation 日志聚合 In comparison to log-centric systems like Scribe or Flume
    Percolator
    友盟吴磊:移动大数据平台的架构、实践与数据增值
    Twitter的RPC框架Finagle简介
  • 原文地址:https://www.cnblogs.com/fengyuehan/p/poj1113.html
Copyright © 2011-2022 走看看