记录编号 |
213945 |
评测结果 |
AAAAAAAA |
题目名称 |
圈奶牛 |
最终得分 |
100 |
用户昵称 |
/k |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.026 s |
提交时间 |
2015-12-13 19:41:41 |
内存使用 |
0.47 MiB |
显示代码纯文本
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
struct u
{
double x;
double y;
}c[10100];
int n;
int q[1010],w;
double pr;
inline bool g(const u & aa,const u & bb)
{
if(aa.x==bb.x)
return aa.y<bb.y;
return aa.x<bb.x;
}
int main()
{
freopen("fc.in","r",stdin);
freopen("fc.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&c[i].x,&c[i].y);
sort(c+1,c+1+n,g);
q[++w]=1;
q[++w]=2;
for(int i=3;i<=n;i++)
{
int t=q[w],u=q[w-1];
double p=(c[t].x-c[u].x)*(c[i].y-c[t].y)-(c[t].y-c[u].y)*(c[i].x-c[t].x);
/*if(i==4)
printf("%d %d",t,u);*/
while(w>=2&&p<=0.0)
{
w--;
t=q[w],u=q[w-1];
p=(c[t].x-c[u].x)*(c[i].y-c[t].y)-(c[t].y-c[u].y)*(c[i].x-c[t].x);
}
q[++w]=i;
}
//printf("%d %d %d",q[1],q[2],q[3]);
for(int i=1;i<w;i++)
{
pr+=sqrt((c[q[i]].x-c[q[i+1]].x)*(c[q[i]].x-c[q[i+1]].x)+(c[q[i]].y-c[q[i+1]].y)*(c[q[i]].y-c[q[i+1]].y));
}
//printf("%lf",pr);
//printf("%d ",w);
w=0;
q[++w]=n;
q[++w]=n-1;
for(int i=n-2;i>=1;i--)
{
int t=q[w],u=q[w-1];
// if(i==1)
// printf("%lf %",c[t].x,c[t].y);
double p=(c[t].x-c[u].x)*(c[i].y-c[t].y)-(c[t].y-c[u].y)*(c[i].x-c[t].x);
while(w>=2&&p<=0.0)
{
//printf("j%d",q[w]);
w--;
t=q[w],u=q[w-1];
p=(c[t].x-c[u].x)*(c[i].y-c[t].y)-(c[t].y-c[u].y)*(c[i].x-c[t].x);
}
q[++w]=i;
}
//printf("%d %d %d\n",q[1],q[2],q[3]);
for(int i=1;i<w;i++)
{
pr+=sqrt((c[q[i]].x-c[q[i+1]].x)*(c[q[i]].x-c[q[i+1]].x)+(c[q[i]].y-c[q[i+1]].y)*(c[q[i]].y-c[q[i+1]].y));
//printf("%lf\n",pr);
}
//pr=(double)sqrt((float)pr);
printf("%.2lf",pr);
}