您的位置:首页 > 其它

凸包问题 poj 2187

2013-09-30 19:59 302 查看
【题意】:给出n个点的坐标 求这里面两点距离的平方最大的 输出其值

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct point{int x;int y;};

point p[60000],ch[60000],v,w;
int m,n;

int cmp(point a,point b)
{
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}

int cross(point a,point b,point c)
{
w.x=a.x-b.x;     w.y=a.y-b.y;
v.x=c.x-b.x;     v.y=c.y-b.y;
return w.x*v.y-w.y*v.x;
}

int tubao()
{
int i;
m=0;
sort(p,p+n,cmp);

for(i=0;i<n;i++)
{
while(m>1&&cross(ch[m-1],ch[m-2],p[i])<=0)   //先判断 m>1 再判断后面的
{

m--;
}
ch[m].x=p[i].x;   ch[m++].y=p[i].y;
}
int k=m;
for(i=n-2;i>=0;i--)
{
while(m>k&&cross(ch[m-1],ch[m-2],p[i])<=0)   //
m--;
ch[m].x=p[i].x;   ch[m++].y=p[i].y;
}
if(n>1)
m--;
return m;
}

int length(point a,point b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

int main()
{
int i,j;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
tubao();
int ans=0;
for(i=0;i<m;i++)
for(j=i+1;j<m;j++)
{
int t=length(ch[i],ch[j]);
if(t>ans)
ans=t;
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: