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;
}

目录
相关文章
|
6月前
凸多边形的划分(区间dp)
凸多边形的划分(区间dp)
44 0
|
存储 C++
C++/PTA 求两点之间距离
定义一个Point类,有两个数据成员:x和y, 分别代表x坐标和y坐标,并有若干成员函数。 定义一个函数Distance(), 用于求两点之间的距离。
225 0
最短路模型(二)
AcWing 188. 武士风度的牛
324 0
最短路模型(二)
|
存储 算法
最短路模型(一)
复习acwing算法提高课的内容,本篇为讲解算法:最短路模型,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
129 0
最短路模型(一)
|
Go
[Nowcoder / POJ2728] 最优比率生成树 | 二分 + prim
有n个点,其中,每个点给出位置坐标( x , y ) 以及高度z ,两点之间的距离为两点之间的欧几里得距离 两点之间建立一条路的代价为两点之间的高度差,问将n 个点联通的情况下,求出最大的cost/dis
128 0
|
机器学习/深度学习
【组合数学】递推方程 ( 非齐次部分是 指数函数 且 底是特征根 | 求特解示例 )
【组合数学】递推方程 ( 非齐次部分是 指数函数 且 底是特征根 | 求特解示例 )
156 0
|
机器学习/深度学习 算法 C语言
【算法导论】有向图的可达矩阵
        有时候,我们关注的不是从一个地点到另一个地点的费用,而是能否从一个顶点到达另一个顶点。因此我们可以假设所有边的权值为单位1,在下面的算法中,我们可以在O(n*n*n)的时间内计算出图中任意两点是否可达,我用可达矩阵来表示有向图中两者是否可达。
2929 1
Newton-Raphson切线法解高次方程近似根
Newton-Raphson切线法解高次方程近似根   对于一般的一次,二次方程来说,求解方程的根比较简单。但是对于四次、五次甚至更高次方程,求解方程的f(x)=0的根变得十分困难甚至不可能完成。
1621 0