| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴个AC代码数据类型用int
别用double
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct P
{
int x,y;
P(){}
P(int x,int y):x(x),y(y){
}
P operator -(P p){
return P(x-p.x,y-p.y);//返回一个对象。
}
double det(P p){
return x*p.y-y*p.x;//返回一个数。
}
};
P p[100005],qs[100005];
bool cmp(P a,P b)
{
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}
int main()
{
int i,j,n,maxx,dis;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
sort(p+1,p+n+1,cmp);
int k=0;
for(i=1;i<=n;i++)//保证至少有两个点。
{
while(k>1 && (qs[k]-qs[k-1]).det(p[i]-qs[k-1])<=0)
k--;
qs[++k]=p[i];
}
int t=k;
for(i=n;i>=1;i--)//保证至少有t个点。
{
while(k>t && (qs[k]-qs[k-1]).det(p[i]-qs[k-1])<=0)
k--;
qs[++k]=p[i];
}
k--;//最后一个点和起点重合。
maxx=-1;
for(i=1;i<=k-1;i++)
for(j=i+1;j<=k;j++)
{
dis=(qs[i].x-qs[j].x)*(qs[i].x-qs[j].x)+(qs[i].y-qs[j].y)*(qs[i].y-qs[j].y);
if(dis>maxx) maxx=dis;
}
cout<<maxx<<endl;
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator