poj2187(最远点的距离的平方)
2015-09-23 20:05
246 查看
题意:
给出n个点,求最远的点对的距离的平方。
思路:
旋转卡壳。
代码:
给出n个点,求最远的点对的距离的平方。
思路:
旋转卡壳。
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<vector> using namespace std; const double pi=acos(-1.0); const double eps=1e-8; int cmp(double x) { if(fabs(x)<eps) return 0; if(x>0) return 1; return -1; } inline double sqr(double x) { return x*x; } struct point { double x,y; point() {} point(double a,double b):x(a),y(b){} friend point operator + (const point &a,const point &b) { return point(a.x+b.x,a.y+b.y); } friend point operator - (const point &a,const point &b) { return point(a.x-b.x,a.y-b.y); } friend bool operator == (const point &a,const point &b) { return cmp(a.x-b.x)==0&&cmp(a.y-b.y)==0; } friend point operator * (const point &a,const double &b) { return point(a.x*b,a.y*b); } friend point operator * (const double &a,const point &b) { return point(a*b.x,a*b.y); } friend point operator / (const point &a,const double &b) { return point(a.x/b,a.y/b); } double norm() { return sqrt(sqr(x)+sqr(y)); } }; double det(const point &a,const point &b)//cha { return a.x*b.y-a.y*b.x; } double dot(const point &a,const point &b) { return a.x*b.x+a.y*b.y; } double dist(const point &a,const point &b) { return (a-b).norm(); } point rotate_point(const point &p,double A)//ni { double tx=p.x,ty=p.y; return point(tx*cos(A)-ty*sin(A),tx*sin(A)+ty*cos(A)); } struct polygon_convex { vector<point> P; polygon_convex(int Size=0) { P.resize(Size); } }; bool cmp_less(const point &a,const point &b) { return cmp(a.x-b.x)<0||cmp(a.x-b.x)==0&&cmp(a.y-b.y)<0; } polygon_convex convex_hull(vector<point> a) { polygon_convex res(2*a.size()+5); sort(a.begin(),a.end(),cmp_less); a.erase(unique(a.begin(),a.end()),a.end()); int m=0; for(int i=0;i<a.size();i++) { while(m>1 && cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<=0) --m; res.P[m++]=a[i]; } int k=m; for(int i=int(a.size())-2;i>=0;i--) { while(m>k && cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<=0) --m; res.P[m++]=a[i]; } res.P.resize(m); if(a.size()>1) res.P.resize(m-1); return res; } double convex_diameter(polygon_convex &a,int &First,int &Second) { vector<point> &p=a.P; int n=p.size(); double maxd=0.0; if(n==1) { First=Second=0; return maxd; } #define next(i) ((i+1)%n) for(int i=0,j=1;i<n;i++) { while(cmp(det(p[next(i)]-p[i],p[j]-p[i])-det(p[next(i)]-p[i],p[next(j)]-p[i]))<0) { j=next(j); } double d=dist(p[i],p[j]); if(d>maxd) { maxd=d; First=i,Second=j; } d=dist(p[next(i)],p[next(j)]); if(d>maxd) { maxd=d; First=i,Second=j; } } return maxd; } vector<point> tt; int main() { int n; while(scanf("%d",&n)!=EOF) { tt.clear(); for(int i=0;i<n;i++) { double tx,ty; scanf("%lf%lf",&tx,&ty); tt.push_back(point(tx,ty)); } polygon_convex xx=convex_hull(tt); int ans1,ans2; double ans=convex_diameter(xx,ans1,ans2); printf("%.0lf\n",ans*ans); } return 0; }
相关文章推荐
- 使用Android Studio时的一个问题
- iOS-App上架流程
- xml直接读取节点
- 我公司在做什么(“paas平台”)
- Android 5.0新特性ToolBar
- 总要问个为什么?
- hdu 1114--Piggy-Bank(完全背包)
- 第4周—项目4 建立双链表算法库
- Hill密码
- Effective C++——条款53(第9章)
- android可扩展自己的定义,运动图像裁剪框
- Build better apps: Windows 10 by 10 development series
- POJ 2886 线段树
- Java内存管理原理及内存区域详解
- 青蛙跳台问题
- 124 Binary Tree Maximum Path Sum
- 带条件查询离当前时间最近的一条记录
- iOS-APP发布应注意要点
- [转]图解SQL连接语句
- PowerShell 查看SqlServer默认实例密钥/序列号