zoukankan      html  css  js  c++  java
  • hdu 3007 Buried memory 最远点对

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3007

    Each person had do something foolish along with his or her growth.But,when he or she did this that time,they could not predict that this thing is a mistake and they will want this thing would rather not happened.
    The world king Sconbin is not the exception.One day,Sconbin was sleeping,then swakened by one nightmare.It turned out that his love letters to Dufein were made public in his dream.These foolish letters might ruin his throne.Sconbin decided to destroy the letters by the military exercises's opportunity.The missile is the best weapon.Considered the execution of the missile,Sconbin chose to use one missile with the minimum destruction.
    Sconbin had writen N letters to Dufein, she buried these letters on different places.Sconbin got the places by difficult,he wants to know where is the best place launch the missile,and the smallest radius of the burst area. Let's help Sconbin to get the award.
    题意描述:给出n封信的二维坐标,找到一个坐标点,使其距离n封信的最远距离最近。
    算法分析:最远点对的模板题。需要注意一点:题目中的坐标点没规律,最远点对的算法针对凸边形,所以首先我们得对题目点集凸包化。
      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<cmath>
      6 #include<algorithm>
      7 #include<vector>
      8 #define inf 0x7fffffff
      9 #define exp 1e-10
     10 #define PI 3.141592654
     11 using namespace std;
     12 const int maxn=500+10;
     13 
     14 int n;
     15 struct Point
     16 {
     17     double x,y;
     18     Point(double x=0,double y=0):x(x),y(y){}
     19 }an[maxn],bn[maxn];
     20 typedef Point Vector;
     21 double dcmp(double x)
     22 {
     23     if (fabs(x)<exp) return 0;
     24     return x<0 ? -1 : 1;
     25 }
     26 Vector operator + (Vector A,Vector B) {return Vector(A.x+B.x , A.y+B.y); }
     27 Vector operator - (Vector A,Vector B) {return Vector(A.x-B.x , A.y-B.y); }
     28 Vector operator * (Vector A,double p) {return Vector(A.x*p , A.y*p); }
     29 Vector operator / (Vector A,double p) {return Vector(A.x/p , A.y/p); }
     30 bool operator < (Point a,Point b) {return a.x<b.x || (a.x==b.x && a.y<b.y); }
     31 bool operator == (Point a,Point b) {return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0; }
     32 
     33 double Dot(Vector A,Vector B) {return A.x*B.x + A.y*B.y ; }
     34 double Length(Vector A,Vector B) {return sqrt(Dot(A,A)); }
     35 double cross(Vector A,Vector B) {return A.x*B.y - B.x*A.y; }
     36 
     37 double dist(Point A,Point B)
     38 {
     39     double xx=(A.x-B.x)*(A.x-B.x);
     40     double yy=(A.y-B.y)*(A.y-B.y);
     41     return sqrt(xx+yy);
     42 }
     43 
     44 Point cur;
     45 double rotating_calipers(Point *ch,int n)
     46 {
     47     int q=1;
     48     double ans=-1;
     49     cur.x=cur.y=0;
     50     ch[n]=ch[0];
     51     for (int p=0 ;p<n ;p++)
     52     {
     53         while (cross(ch[q+1]-ch[p+1],ch[p]-ch[p+1])>cross(ch[q]-ch[p+1],ch[p]-ch[p+1]))
     54             q=(q+1)%n;
     55         double len=dist(ch[p],ch[q]);
     56         double len2=dist(ch[p+1],ch[q+1]);
     57         if (len>ans+exp)
     58         {
     59             ans=len;
     60             cur.x=(ch[p].x+ch[q].x)/2.0;
     61             cur.y=(ch[p].y+ch[q].y)/2.0;
     62         }
     63         if (len2>ans+exp)
     64         {
     65             ans=len2;
     66             cur.x=(ch[p+1].x+ch[q+1].x)/2.0;
     67             cur.y=(ch[p+1].y+ch[q+1].y)/2.0;
     68         }
     69     }
     70     return ans;
     71 }
     72 
     73 int Convexhull(Point *p,int n,Point *ch)
     74 {
     75     sort(p,p+n);
     76     int m=0;
     77     for (int i=0 ;i<n ;i++)
     78     {
     79         while (m>1 && dcmp(cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<0) m--;
     80         ch[m++]=p[i];
     81     }
     82     int k=m;
     83     for (int i=n-2 ;i>=0 ;i--)
     84     {
     85         while (m>k && dcmp(cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<0) m--;
     86         ch[m++]=p[i];
     87     }
     88     if (n>1) m--;
     89     return m;
     90 }
     91 
     92 int main()
     93 {
     94     while (scanf("%d",&n)!=EOF && n)
     95     {
     96         for (int i=0 ;i<n ;i++) scanf("%lf%lf",&an[i].x,&an[i].y);
     97         if (n==1) {printf("%.2lf %.2lf 0.00
    ",an[0].x,an[0].y);continue; }
     98         if (n==2) {printf("%.2lf %.2lf %.2lf
    ",(an[0].x+an[1].x)/2.0,
     99             (an[0].y+an[1].y)/2.0,dist(an[0],an[1])/2.0);continue; }
    100         int m=Convexhull(an,n,bn);
    101         double ans=rotating_calipers(bn,m);
    102         printf("%.2lf %.2lf %.2lf
    ",cur.x,cur.y,ans/2.0);
    103     }
    104     return 0;
    105 }
  • 相关阅读:
    监听
    用户管理
    oracle网络
    实例 参数
    存储管理
    oracle 体系
    实例
    修改
    集合操作
    17.08.18
  • 原文地址:https://www.cnblogs.com/huangxf/p/4373994.html
Copyright © 2011-2022 走看看