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 }
  • 相关阅读:
    ExtJs gridPanel Column 时间格式化
    Asp.Net MVC结合ExtJs gridPanel 分页和高度自适应
    iOS组件化思路-大神博客研读和思考
    怎么面试架构师
    iOS应用架构谈 本地持久化方案及动态部署
    iOS应用架构谈 网络层设计方案
    iOS应用架构谈 view层的组织和调用方案
    iOS应用架构谈 开篇
    隐藏TabBar是个累人的活
    App升级时数据库的迁移更新
  • 原文地址:https://www.cnblogs.com/huangxf/p/4373994.html
Copyright © 2011-2022 走看看