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



posted @ 2012-03-28 11:22  枫月寒  阅读(137)  评论(0编辑  收藏  举报