• hdu2215(最小覆盖圆)


    Maple trees

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1578    Accepted Submission(s): 488


    Problem Description
    There are a lot of trees in HDU. Kiki want to surround all the trees with the minimal required length of the rope . As follow,

    To make this problem more simple, consider all the trees are circles in a plate. The diameter of all the trees are the same (the diameter of a tree is 1 unit). Kiki can calculate the minimal length of the rope , because it's so easy for this smart girl.
    But we don't have a rope to surround the trees. Instead, we only have some circle rings of different radius. Now I want to know the minimal required radius of the circle ring. And I don't want to ask her this problem, because she is busy preparing for the examination.
    As a smart ACMer, can you help me ?
     
    Input
    The input contains one or more data sets. At first line of each input data set is number of trees in this data set n (1 <= n <= 100), it is followed by n coordinates of the trees. Each coordinate is a pair of integers, and each integer is in [-1000, 1000], it means the position of a tree’s center. Each pair is separated by blank.
    Zero at line for number of trees terminates the input for your program.
     
    Output
    Minimal required radius of the circle ring I have to choose. The precision should be 10^-2.
     
    Sample Input
    2
    1 0
    -1 0
    0
     
    Sample Output
    1.50
     
    题意:用一个最小的圆把所有的点都圈在里边,点可以在圆上,每个点的半径为0.50
      1 #include<stdio.h>
      2 #include<math.h>
      3 #define PI acos(-1.0)
      4 struct   TPoint
      5 {
      6     double x,y;
      7 }a[1005],d;
      8 double r;
      9 double   distance(TPoint   p1,   TPoint   p2)
     10 {
     11     return (sqrt((p1.x-p2.x)*(p1.x -p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
     12 }
     13 double multiply(TPoint   p1,   TPoint   p2,   TPoint   p0)
     14 {
     15     return   ((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
     16 }
     17 void MiniDiscWith2Point(TPoint   p,TPoint   q,int   n)
     18 {
     19     d.x=(p.x+q.x)/2.0;
     20     d.y=(p.y+q.y)/2.0;
     21     r=distance(p,q)/2;
     22     int k;
     23     double c1,c2,t1,t2,t3;
     24     for(k=1; k<=n; k++)
     25     {
     26         if(distance(d,a[k])<=r)
     27             continue;
     28         if(multiply(p,q,a[k])!=0.0)
     29         {
     30             c1=(p.x*p.x+p.y*p.y-q.x*q.x-q.y*q.y)/2.0;
     31             c2=(p.x*p.x+p.y*p.y-a[k].x*a[k].x-a[k].y*a[k].y)/2.0;
     32 
     33             d.x=(c1*(p.y-a[k].y)-c2*(p.y-q.y))/((p.x-q.x)*(p.y-a[k].y)-(p.x-a[k].x)*(p.y-q.y));
     34             d.y=(c1*(p.x-a[k].x)-c2*(p.x-q.x))/((p.y-q.y)*(p.x-a[k].x)-(p.y-a[k].y)*(p.x-q.x));
     35             r=distance(d,a[k]);
     36         }
     37         else
     38         {
     39             t1=distance(p,q);
     40             t2=distance(q,a[k]);
     41             t3=distance(p,a[k]);
     42             if(t1>=t2&&t1>=t3)
     43             {
     44                 d.x=(p.x+q.x)/2.0;
     45                 d.y=(p.y+q.y)/2.0;
     46                 r=distance(p,q)/2.0;
     47             }
     48             else if(t2>=t1&&t2>=t3)
     49             {
     50                 d.x=(a[k].x+q.x)/2.0;
     51                 d.y=(a[k].y+q.y)/2.0;
     52                 r=distance(a[k],q)/2.0;
     53             }
     54             else
     55             {
     56                 d.x=(a[k].x+p.x)/2.0;
     57                 d.y=(a[k].y+p.y)/2.0;
     58                 r=distance(a[k],p)/2.0;
     59             }
     60         }
     61     }
     62 }
     63 
     64 void MiniDiscWithPoint(TPoint   pi,int   n)
     65 {
     66     d.x=(pi.x+a[1].x)/2.0;
     67     d.y=(pi.y+a[1].y)/2.0;
     68     r=distance(pi,a[1])/2.0;
     69     int j;
     70     for(j=2; j<=n; j++)
     71     {
     72         if(distance(d,a[j])<=r)
     73             continue;
     74         else
     75         {
     76             MiniDiscWith2Point(pi,a[j],j-1);
     77         }
     78     }
     79 }
     80 int main()
     81 {
     82     int i,n;
     83     while(scanf("%d",&n)&&n)
     84     {
     85         for(i=1; i<=n; i++)
     86             scanf("%lf %lf",&a[i].x,&a[i].y);
     87         if(n==1)
     88         {
     89             printf("0.50
    ");
     90             continue;
     91         }
     92 
     93         r=distance(a[1],a[2])/2.0;
     94         d.x=(a[1].x+a[2].x)/2.0;
     95         d.y=(a[1].y+a[2].y)/2.0;
     96         for(i=3; i<=n; i++)
     97         {
     98             if(distance(d,a[i])<=r)
     99                 continue;
    100             else
    101                 MiniDiscWithPoint(a[i],i-1);
    102         }
    103         printf("%.2lf
    ",r+0.5);
    104     }
    105     return 0;
    106 }
    View Code
  • 相关阅读:
    C
    B
    A
    G
    BZOJ_1208_&_Codevs_1258_[HNOI2004]_宠物收养所_(平衡树/set)
    Codevs_1230_元素查找_(set/Hash)
    POJ_2503_Babelfish_(Trie/map)
    POJ_2001_Shortest_Prefixes_(Trie)
    BZOJ_3670_[NOI2014]_动物园_(kmp)
    BZOJ_3196_二逼平衡树_(树套树,线段树+Treap)
  • 原文地址:https://www.cnblogs.com/lxm940130740/p/3900872.html
Copyright © 2020-2023  润新知