记录编号 213945 评测结果 AAAAAAAA
题目名称 圈奶牛 最终得分 100
用户昵称 Gravatar/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);
}