| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:一般是你程序的问题, 贴个代码看看In Reply To:一般是你程序的问题, 贴个代码看看 Posted by:MrRight at 2008-09-01 21:12:59 谢谢
#include <stdio.h>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX=1010;
const double EPS=1e-7;
const double INF=1e250;
const double PI =acos(-1.0);
struct PT
{
double x,y,ang;
}pt[MAX];
int N,L,ps,stk[MAX];
inline double dis(PT a,PT b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int cmp(PT a,PT b)
{
return a.ang-b.ang>EPS;
}
double crossP(PT a,PT b,PT c)// abXac cross product
{
return (c.y-a.y)*(b.x-a.x)-(c.x-a.x)*(b.y-a.y);
}
inline int sign(double a)
{
if(fabs(a)<EPS)
return 0;
return a>EPS?1:-1;
}
int main()
{
int t,leftest,tt;
scanf("%d%d",&N,&L);
for(t=0;t<N;t++)
scanf("%lf%lf",&pt[t].x,&pt[t].y);
double minx,miny;
minx=miny=INF;
for(t=0;t<N;t++)
{
if(sign(pt[t].y-miny)==-1 || (sign(pt[t].y-miny)==0 && sign(pt[t].x-minx)==-1))
{
miny=pt[t].y;
minx=pt[t].x;
leftest=t;
}
}
swap(pt[0],pt[leftest]);
for(t=1;t<N;t++)
pt[t].ang=(pt[t].x-pt[0].x)/dis(pt[0],pt[t]);
sort(pt+1,pt+N,cmp);
for(t=0;t<=2;t++)
stk[t]=t;
ps=2;
for(t=3;t<N;t++)
{
while(crossP(pt[stk[ps-1]],pt[stk[ps]],pt[t])<EPS){
ps--;
}
ps++;
stk[ps]=t;
}
double sum=0.0;
for(t=0;t<=ps;t++)
{
sum+=dis(pt[stk[t]],pt[stk[(t+1)%(ps+1)]]);
}
sum+=PI*L*2;
printf("%.0lf\n",sum);
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator