poj1113 Wall

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define pi acos(-1.0)
struct point
{
	double x;
	double y;
}pp[1010];
struct Vector
{
	double x;
	double y;
};
double chaji(Vector a,Vector b)//a*b
{
	return a.x*b.y-b.x*a.y;
}
Vector operator-(point a,point b)
{
	Vector temp;
	temp.x=a.x-b.x;
	temp.y=a.y-b.y;
	return temp;
}
bool cmp(const point a,const point b)
{
	Vector m=a-pp[0];
	Vector n=b-pp[0];
	if(chaji(m,n)>0)
	{
		return true;
	}
	if(chaji(m,n)==0)
	{
		if(a.x==b.x)
		{
			return a.y<b.y;
		}
		return a.x<b.x;
	}
	return false;
}
struct node
{
	int u;//节点u
	node *next;
	node *front;
};
double distpp(point a,point b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
	int N,L;
	scanf("%d %d",&N,&L);
	int i;
	for(i=0;i<N;i++)
	{
		scanf("%lf %lf",&pp[i].x,&pp[i].y);
	}
	int mini;
	mini=0;
	for(i=1;i<N;i++)
	{
		if(pp[i].y<pp[mini].y)
		{
			mini=i;
		}
		if(pp[i].y==pp[mini].y)
		{
			if(pp[i].x<pp[mini].x)
			{
				mini=i;
			}
		}
	}
	point temp;
	temp=pp[0];
	pp[0]=pp[mini];
	pp[mini]=temp;
	//pp[0]为基点
	sort(pp+1,pp+N,cmp);
	node head;
	head.front=NULL;
	head.next=NULL;
	head.u=0;
	head.next=new node;
	head.next->front=&head;
	head.next->u=1;
	node *p;
	p=head.next;
	p->next=NULL;
	Vector m,n;
	for(i=2;i<N;i++)//p指针一直指向链表的最后的一个节点
	{
		m=pp[p->u]-pp[p->front->u];
		n=pp[i]-pp[p->u];
		if(chaji(m,n)>=0)
		{
			p->next=new node;
			p->next->next=NULL;
			p->next->front=p;
			p->next->u=i;
			p=p->next;
			continue;
		}
		bool flag=false;
		int v=i;
		if(chaji(m,n)<0)//v为处理中的当前节点
		{
			//node linshi;
			p->next=new node;
			p->next->next=NULL;
			p->next->front=p->front;
			p->next->u=v;
			p->front->next=p->next;
			p=p->front;
			flag=true;
			if(p->front==NULL)
			{
				while(p->next!=NULL)
				{
					p=p->next;
				}
				continue;
			}
			m=pp[p->u]-pp[p->front->u];
			n=pp[p->next->u]-pp[p->u];
		}
		if(flag)
		{
			while(chaji(m,n)<=0)
			{
				p->next->front=p->front;
				p->front->next=p->next;
				p=p->front;
				if(p->front==NULL)
				{
					break;
				}
				m=pp[p->u]-pp[p->front->u];
				n=pp[p->next->u]-pp[p->u];
			}
		}
		while(p->next!=NULL)
		{
			p=p->next;
		}
	}
	//只差最后的结果计算
	p=&head;
	double res=0;
	while(p->next!=NULL)
	{
		res+=distpp(pp[p->u],pp[p->next->u]);
		p=p->next;
	}
	res+=distpp(pp[0],pp[p->u]);
	res+=2*pi*L;
	int grid=(int)(res*10)%10;
	if(grid>=5)
	{
		printf("%d\n",1+(int)res);
	}
	else
	{
		printf("%d\n",(int)res);
	}
	return 0;
}
//264K 47MS 

 我是用链表做的。。。

posted @ 2012-07-28 16:37  willzhang  阅读(139)  评论(0编辑  收藏  举报