`
阿尔萨斯
  • 浏览: 4472056 次
社区版块
存档分类
最新评论

POJ 2187 Beauty Contest(凸包:最远点对距离)

 
阅读更多

POJ 2187 Beauty Contest(凸包:最远点对距离)

http://poj.org/problem?id=2187

题意:

平面上给你n个点,要你求出这n个点中的任意两点的最远距离的平方?

分析:

点集的最远点对一定是在凸包上的两个顶点,本题先求出点集的凸包,然后暴力枚举凸包上任意两个顶点的距离即可.(不会超时)本来用旋转卡壳应该是最好的,但是还没有学,只能暴力枚举了…

本题所有数据都是int,最后结果也只要返回距离的平方就行.这明摆着再说”如果全都用int计算,能加快计算速度”. 当然我还是用double做的.

还要注意凸包退化成2点的情况.

AC代码: C++提交,G++提交有double精度问题,会出错

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps=1e-10;
int dcmp(double x)
{
    if(fabs(x)<eps) return 0;
    return x<0?-1:1;
}
struct Point
{
    double x,y;
    Point(){}
    Point(double x,double y):x(x),y(y){}
    bool operator<(const Point &B)const
    {
        return dcmp(x-B.x)<0 || (dcmp(x-B.x)==0 && dcmp(y-B.y)<0);
    }
    bool operator==(const Point &B)const
    {
        return dcmp(x-B.x)==0 && dcmp(y-B.y)==0;
    }
};
typedef Point Vector;
Vector operator-(Point A,Point B)
{
    return Vector(A.x-B.x,A.y-B.y);
}
double Cross(Vector A,Vector B)
{
    return A.x*B.y-A.y*B.x;
}
int ConvexHull(Point *p,int n,Point *ch)
{
    sort(p,p+n);
    n=unique(p,p+n)-p;
    int m=0;
    for(int i=0;i<n;i++)
    {
        while(m>1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2])<=0) m--;
        ch[m++]=p[i];
    }
    int k=m;
    for(int i=n-2;i>=0;i--)
    {
        while(m>k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2])<=0 ) m--;
        ch[m++]=p[i];
    }
    if(n>1) m--;
    return m;
}

const int maxn=50000+5;
Point p[maxn],ch[maxn];
double dist2(Point a,Point b)//返回距离的平方
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        for(int i=0;i<n;++i)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        int m=ConvexHull(p,n,ch);
        if(m==2)
        {
            printf("%.0lf",dist2(ch[0],ch[1]));
            continue;
        }
        else
        {
            double ans=-1e10;
            for(int i=0;i<m;i++)
            for(int j=i+1;j<m;j++)
                ans=max(ans,dist2(ch[i],ch[j]));
            printf("%.0lf\n",ans);//要用C++提交,G++有精度问题
        }
    }
    return 0;
}

分享到:
评论

相关推荐

    POJ2187-Beauty Contest

    【描述】"北大POJ2187-Beauty Contest"是一个典型的计算机科学问题,其解题报告包含了对问题的理解、解决方案的设计以及通过验证的源代码。解题报告是编程竞赛中不可或缺的一部分,它记录了解决问题的思路和过程,有...

    pku_poj_2187.rar_poj 2187_凸包问题

    描述中的“O(nlogn)凸包问题 poj2187”提示我们解决这个问题的算法时间复杂度应为O(nlogn),意味着我们需要一种高效的方法来处理包含n个点的凸包构建。 在计算机科学中,凸包问题是一个经典几何问题,特别是在算法...

    凸包练习: POJ 2187(JAVA)

    【标题】"凸包练习: POJ 2187(JAVA)" 是一个关于编程算法的挑战,主要涉及计算机科学中的几何算法。在本问题中,我们关注的是二维平面上的点集及其凸包(Convex Hull)的概念。凸包可以被理解为一个最小的多边形,该...

    经典 的POJ 分类

    根据给定的信息,我们可以将这些知识点分为几个大类别:数据...以上是对经典POJ分类的详细解析,通过这些知识点的学习,可以帮助我们更好地理解和掌握算法与数据结构的基础知识,并能够应用于实际问题的解决过程中。

    acm新手刷题攻略之poj

    POJ(Peking University Online Judge)作为国内最早且最知名的在线评测系统之一,拥有丰富的题库资源,对于提高算法水平、熟悉编程竞赛模式具有不可替代的作用。本文将详细介绍POJ入门必做题目及其分类与推荐,帮助...

    POJ入门题库(含解题思路和答案)

    这些题目是针对ACM竞赛(ACM International Collegiate Programming Contest,简称ICPC)中的编程训练,POJ(Problem Set for Online Judges)是一个在线的编程竞赛平台,提供了许多算法和逻辑思维的练习题目。...

    poj题目分类

    poj题目分类 POJ(Princeton Online Judge)是一個在线编程平台...4. 凸包:例如 poj2187、poj1113。 这些知识点涵盖了算法、数据结构、数学、计算几何学等领域的多个方面,为编程爱好者和学生提供了广泛的知识基础。

    acm 分类 北大

    - 凸包:找出一组点的最小凸包,如POJ2187。 这些知识点构成了ACM竞赛的基础,对于参赛者来说,理解和熟练掌握这些算法和数据结构是取得好成绩的关键。通过练习和不断挑战,选手们的编程思维和问题解决能力会得到...

    POJ算法题目分类

    POJ 算法题目分类 POJ 算法题目分类是指分类所有 POJ 题目的算法思想和解决方案,本文将对算法分类进行详细的介绍。 一、基本算法 ...* 凸包:凸包是指解决问题的凸包算法,如 poj2187、poj1113。

    POJ1113-Wall【凸包】

    总之,解决POJ1113-Wall问题,不仅需要对凸包算法有深入的理解,还需要能够将理论知识应用到实际的编程实践中。通过解决这类问题,我们能够锻炼和提升解决复杂几何问题的能力,对算法的实际应用也会有更加深刻的认识...

    学习凸包(三):凸包练习 POJ 1113

    这篇博客“学习凸包(三): 凸包练习 POJ 1113”显然是关于如何通过编程解决凸包问题的一个实例。我们将深入探讨这个话题,主要关注凸包的定义、常见的求解算法以及如何用Java实现。 凸包可以被定义为一个给定集合中...

    ACM常用算法及其相应的练习题.docx

    * 凸包:poj2187, poj1113 中级部分: 一、基本算法 * C++的标准模版库的应用 + poj3096, poj3007 * 较为复杂的模拟题的训练 + poj3393, poj1472, poj3371, poj1027, poj2706 二、图算法 * 差分约束系统的...

    acm训练计划(poj的题)

    - (poj3295):讲解如何利用贪心策略来解决问题,强调每一步选择都是局部最优解。 5. **动态规划**: - (poj1068, poj2632, poj1573, poj2993, poj2996):动态规划是一种通过分解问题为子问题,并将子问题的结果...

    ACMer需要掌握的算法讲解 (2).docx

    * POJ3109、POJ1478、POJ1462、POJ2729、POJ2048、POJ3336、POJ3315、POJ2148、POJ1263 八、附录 * ACM算法列表 + 哈希表、哈希数组 + 堆、优先队列 + 双端队列可并堆左偏堆 + Treap伸展树并查集 + 集合计数...

    凸包模版旋转卡壳

    然而,在某些数据集上,如 POJ2187 题目,凸包顶点数较少时,两者差异可能不明显。 总之,凸包模版旋转卡壳算法是一种高效的计算二维点集凸包直径的方法。它通过巧妙地利用了凸包性质和叉积来优化搜索过程,实现了...

    poj 图论 集合

    根据提供的文件信息,本文将对其中提及的几个POJ(Peking University Judge Online)平台上的图论题目进行详细的解析,并介绍解决这些问题时所使用的算法和技术。这些题目涵盖了图论中的多个核心概念,如最短路径、...

    ACM常用算法及其相应的练习题 (2).pdf

    例题:poj2187、poj1113。 中级 一、基本算法 * C++的标准模版库的应用:C++的标准模版库是指C++语言的标准库,提供了许多有用的算法和数据结构。例题:poj3096、poj3007。 * 较为复杂的模拟题的训练:较为复杂的...

    POJ题目简单分类(ACM)

    - **凸包**:找到包含所有点的最小凸多边形,如poj2187。 这些知识点是ACM竞赛中常见的主题,掌握了这些,可以有效提升解决算法问题的能力。对于初级选手,可以从基础算法开始,逐步挑战更复杂的图算法和数据结构...

    ACM算法总结大全——超有用!

    4. 凸包:找到一组点的最小凸包,如poj2187、poj1113。 中级阶段: 1. C++标准模板库的应用:如STL中的容器、算法等。 2. 复杂模拟题:如poj3393、poj1472等。 3. 差分约束系统、最小费用最大流、双连通分量和强...

Global site tag (gtag.js) - Google Analytics