Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

这题用凸包很容易过(用时207ms),贴我的代码作参考:

Posted by 0810311106 at 2009-09-10 17:21:55 on Problem 2187 and last updated at 2009-09-10 17:22:56
/*此题用凸包算法可以过,
 对于点对多的。只需要比较凸包边上的点。因为中间的点不可能是点对间距离最大的点*/
#include"stdio.h"
#include"math.h"
#include"stdlib.h"
#define N 50001
struct node
{
	int x;
	int y;
}stack[N],point[N];
int top=-1;
int cmp(const void *a,const void *b)
{
	struct node *aa=(struct node*)a;
	struct node *bb=(struct node*)b;
    return -(aa->x-point[0].x)*(bb->y-point[0].y)+(aa->y-point[0].y)*(bb->x-point[0].x)>=0?1:-1;/*按极坐标逆时针排序*/
}
void push(struct node a)/*进栈*/
{
	if(top!=N-1)
	{ 
		top++;
	    stack[top].x=a.x;
	    stack[top].y=a.y;
	}
	else
	printf("too flow!\n");
}
void pop()/*出栈*/
{
	if(top!=-1)
	top--;
}
int main()
{
	int n;
	int i,j,k;
	struct node temp1;
	float temp;
	scanf("%d",&n);
	scanf("%d%d",&point[0].x,&point[0].y);
	for(i=1;i<n;i++)
	{
		scanf("%d%d",&point[i].x,&point[i].y);
		if(point[i].y<point[0].y||(point[i].y==point[0].y&&point[i].x<point[0].x))/*目的只有一个:使p[0]是最低点,使之作为极坐标的原点*/
		{
			temp1=point[i];
			point[i]=point[0];
			point[0]=temp1;
		}
	}
	qsort(point,n,sizeof(struct node),cmp);/*极坐标排序*/
	/*验证排序*/
	/*printf("\n");
	for(i=0;i<n;i++)
	printf("%d %d\n",point[i].x,point[i].y);
	printf("\n");*/
	push(point[0]);/*将前两点压入栈*/
	push(point[1]);
	i=2;
	do
	{
		/*当p[i]和stack[top-1]够成的直线在直线(stack[top]与stack[top-1]成的直线)右边时。不符要求,出栈,并循环检验*/
		while((point[i].x-stack[top-1].x)*(stack[top].y-stack[top-1].y)-(point[i].y-stack[top-1].y)*(stack[top].x-stack[top-1].x)>0)/*注意不要加等号,因为在凸包边上的点也要考虑*/
	      pop();
		push(point[i]);/*每个点至少进栈一次*/
		i++;
	}while(i<n);
	/*以上步骤剩下的栈内的点就是凸包的边点*/
	k=-1;/*设置最低值*/
	for(i=0;i<top;i++)
	for(j=i+1;j<=top;j++)/*对凸包边点进行距离比较,大大缩小了运算时间*/
	if(pow(stack[i].x-stack[j].x,2)+pow(stack[i].y-stack[j].y,2)>=k)
	k=pow(stack[i].x-stack[j].x,2)+pow(stack[i].y-stack[j].y,2);
	printf("%d\n",k);
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator