poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)

简介:

/*  poj 2187 Beauty Contest
    凸包:寻找每两点之间距离的最大值
    这个最大值一定是在凸包的边缘上的!  
    
    求凸包的算法: Andrew算法! 
*/
#include<iostream> 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct Point{
   Point(){}
   Point(int x, int y){
      this->x=x;
      this->y=y;
   }
   int x, y;
   
  static int cross(Point a, Point b){
       return a.x*b.y - a.y*b.x;
   }
   
  static int dist(Point a, Point b){
       return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y);
   }
   
   Point operator -(Point tmp){
      return Point(x-tmp.x, y-tmp.y);
   }
};

bool cmp(Point a, Point b){
   if(a.x==b.x)
     return a.y<b.y;
   return a.x<b.x;
}

Point p[50005];
int ch[50005];
int n;

int main(){
   int i;
   while(scanf("%d", &n)!=EOF){
      for(i=0; i<n; ++i)
         scanf("%d%d", &p[i].x, &p[i].y);
      sort(p, p+n, cmp);
      int m=0;
      //求下凸包, 如果某一个点不在线段之内,向量的叉积必定是<=0; 
      for(i=0; i<n; ++i){
         while(m>1 && Point::cross(p[ch[m-1]]-p[ch[m-2]], p[i]-p[ch[m-2]])<=0) m--;
         ch[m++]=i;
      }
      //为啥求上凸包的时候,坐标的从n-2开始:因为n-1点一定是在下凸包中的(因为它的横坐标最大,必然是包含其他节点的) 
      int k=m;
      for(i=n-2; i>=0; --i){
         while(m>k && Point::cross(p[ch[m-1]]-p[ch[m-2]], p[i]-p[ch[m-2]])<=0) m--;
         ch[m++]=i;
      }
      --m;
      int maxD=-1, j, d;
      for(i=0; i<m; ++i)
         for(j=i+1; j<=m; ++j)
             if(maxD < (d=Point::dist(p[ch[i]], p[ch[j]])))
                maxD=d;
      printf("%d\n", maxD);
   }
   return 0;
}

目录
相关文章
UVa10075 - Airlines(所有点对之间的最短距离)
UVa10075 - Airlines(所有点对之间的最短距离)
66 0
|
存储 C++
C++/PTA 求两点之间距离
定义一个Point类,有两个数据成员:x和y, 分别代表x坐标和y坐标,并有若干成员函数。 定义一个函数Distance(), 用于求两点之间的距离。
277 0
【矩阵分析】矩阵幂级数 发散 条件 || 幂级数 与 解析函数 的关系 || 幂级数 收敛半径r 的求法
【矩阵分析】矩阵幂级数 发散 条件 || 幂级数 与 解析函数 的关系 || 幂级数 收敛半径r 的求法
【矩阵分析】矩阵幂级数 发散 条件 || 幂级数 与 解析函数 的关系 || 幂级数 收敛半径r 的求法
|
存储 算法 Java
Floyd(弗洛伊德)算法求解每对顶点之间的距离(Java语言)
Floyd(弗洛伊德)算法求解每对顶点之间的距离(Java语言)
141 0
POJ1269 Intersecting Lines(两直线关系)
POJ1269 Intersecting Lines(两直线关系)
78 0
[UVA1364 | POJ | NC]Knights of the Round Table | Tarjan 求点双 | 二分图 | 综合图论
我们可以很轻松地发现,被提出的都是在点双连通分量之外的,比如该图中的1 和 5 ,那么怎么判断哪些点不在环中呢? 此时我们还可以逆向思考,不 在 环 中 的 = = 总 的 − 在 环 中 的,所以说现在问题就转换成了满足条件的环内的点的个数
144 0
[UVA1364 | POJ | NC]Knights of the Round Table | Tarjan 求点双 | 二分图 | 综合图论
|
机器学习/深度学习
【组合数学】递推方程 ( 非齐次部分是 指数函数 且 底是特征根 | 求特解示例 )
【组合数学】递推方程 ( 非齐次部分是 指数函数 且 底是特征根 | 求特解示例 )
178 0
Newton-Raphson切线法解高次方程近似根
Newton-Raphson切线法解高次方程近似根   对于一般的一次,二次方程来说,求解方程的根比较简单。但是对于四次、五次甚至更高次方程,求解方程的f(x)=0的根变得十分困难甚至不可能完成。
1646 0