zoukankan      html  css  js  c++  java
  • Beauty Contest(凸包求最远点)

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

    题意:求凸包上最远点距离的平方

    思路:开始用旋转卡壳求的最远点,WA,改了好久。。后来又改成枚举凸包上的点。。AC了。。

     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <math.h>
     4 using namespace std;
     5 const int N=50005;
     6 int n;
     7 struct Point
     8 {
     9     int x,y;
    10     Point(int x = 0,int y = 0):x(x),y(y) {}
    11     bool friend operator < (const Point &a,const Point &b)
    12     {
    13         return a.x < b.x||(a.x==b.x&&a.y < b.y);
    14     }
    15 
    16 } p[N],ch[N];
    17 typedef Point Vector;
    18 Vector operator-(Point a,Point b)
    19 {
    20     return Vector(a.x-b.x,a.y-b.y);
    21 }
    22 int Cross(Vector A,Vector B)
    23 {
    24     return A.x*B.y-A.y*B.x;
    25 }
    26 int Distance(Point a,Point b)
    27 {
    28     return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
    29 }
    30 int Graham()//判断凸包
    31 {
    32     sort(p,p+n);
    33     int m = 0;
    34     for (int i = 0; i < n; i++)
    35     {
    36         while(m > 1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]) <= 0)
    37             m--;
    38         ch[m++] = p[i];
    39     }
    40     int k = m;
    41     for (int i = n-2; i >= 0; i--)
    42     {
    43         while(m > k && Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]) <= 0)
    44             m--;
    45         ch[m++] = p[i];
    46     }
    47     if (n > 1)
    48         m--;
    49     return m;
    50 }
    51 int main()
    52 {
    53     scanf("%d",&n);
    54     for (int i = 0; i < n; i++)
    55         scanf("%d %d",&p[i].x,&p[i].y);
    56     int cnt = Graham();
    57     int ans = 0;
    58     for (int i = 0; i < cnt ; i++)
    59     {
    60         for (int j = 0; j < i; j++)
    61         {
    62             int dis = Distance(ch[i],ch[j]);
    63             ans = max(ans,dis);
    64         }
    65     }
    66     printf("%d
    ",ans);
    67     return 0;
    68 }
    View Code

    旋转卡壳的那段代码,不知道哪错了,先保留着吧。。后期再改。。

     1 int dia_rotating_calipers(int cnt)//旋转卡壳
     2 {
     3     int dia = 0;
     4     int  q = 1;
     5     for (int i = 0; i < cnt; i++)
     6     {
     7         while(Cross(ch[i+1]-ch[i],ch[q+1]-ch[i]) > Cross(ch[i+1]-ch[i],ch[q]-ch[i]))
     8             q = (q+1)%n;
     9         dia = max(dia,max(Distance(ch[i],ch[q]),Distance(ch[i+1],ch[q+1])));
    10     }
    11     return dia;
    12 }
    View Code
  • 相关阅读:
    IOS开发mapkit学习笔记
    IOS的两种框架设计思想
    关于创建及使用多线程的几种方法
    Linux基础入门 之挑战:历史命令
    20172018网络攻防第三周
    20172018网络攻防第二周
    Linux基础入门实验楼挑战之数据提取
    iconfont字体图标的使用方法超简单!
    CSS中的绝对定位(absolute)误区
    获取对象属性的点方法和中括号法的区别
  • 原文地址:https://www.cnblogs.com/lahblogs/p/3400299.html
Copyright © 2011-2022 走看看