zoukankan      html  css  js  c++  java
  • Super Star(最小球覆盖)

    Super Star

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

    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 6486   Accepted: 1603   Special Judge

    Description

    During a voyage of the starship Hakodate-maru (see Problem 1406), researchers found strange synchronized movements of stars. Having heard these observations, Dr. Extreme proposed a theory of "super stars". Do not take this term as a description of actors or singers. It is a revolutionary theory in astronomy. 
    According to this theory, starts we are observing are not independent objects, but only small portions of larger objects called super stars. A super star is filled with invisible (or transparent) material, and only a number of points inside or on its surface shine. These points are observed as stars by us. 

    In order to verify this theory, Dr. Extreme wants to build motion equations of super stars and to compare the solutions of these equations with observed movements of stars. As the first step, he assumes that a super star is sphere-shaped, and has the smallest possible radius such that the sphere contains all given stars in or on it. This assumption makes it possible to estimate the volume of a super star, and thus its mass (the density of the invisible material is known). 

    You are asked to help Dr. Extreme by writing a program which, given the locations of a number of stars, finds the smallest sphere containing all of them in or on it. In this computation, you should ignore the sizes of stars. In other words, a star should be regarded as a point. You may assume the universe is a Euclidean space. 

    Input

    The input consists of multiple data sets. Each data set is given in the following format. 


    x1 y1 z1 
    x2 y2 z2 
    . . . 
    xn yn zn 

    The first line of a data set contains an integer n, which is the number of points. It satisfies the condition 4 <= n <= 30. 

    The location of n points are given by three-dimensional orthogonal coordinates: (xi, yi, zi) (i = 1, ..., n). Three coordinates of a point appear in a line, separated by a space character. Each value is given by a decimal fraction, and is between 0.0 and 100.0 (both ends inclusive). Points are at least 0.01 distant from each other. 

    The end of the input is indicated by a line containing a zero. 

    Output

    For each data set, the radius of the smallest sphere containing all given points should be printed, each in a separate line. The printed values should have 5 digits after the decimal point. They may not have an error greater than 0.00001.

    Sample Input

    4
    10.00000 10.00000 10.00000
    20.00000 10.00000 10.00000
    20.00000 20.00000 10.00000
    10.00000 20.00000 10.00000
    4
    10.00000 10.00000 10.00000
    10.00000 50.00000 50.00000
    50.00000 10.00000 50.00000
    50.00000 50.00000 10.00000
    0

    Sample Output

    7.07107
    34.64102

    最小球覆盖模板题,先任意选取一个点,然后找到一个离它最远的点,不断逼近

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<string>
     6 #include<algorithm>
     7 #include<queue>
     8 #include<vector>
     9 #include<map>
    10 using namespace std;
    11 
    12 struct Point{
    13     double x,y,z;
    14 }p[35];
    15 
    16 double dist(Point a,Point b){
    17     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
    18 }
    19 
    20 double ac(int n){
    21     double ans=1e9;
    22     Point tmp;
    23     tmp.x=tmp.y=tmp.z=0;;
    24     int s=1;
    25     double step=100;
    26     double esp=0.0000001;
    27     while(step>esp){
    28         for(int i=1;i<=n;i++){
    29             if(dist(tmp,p[s])<dist(tmp,p[i])) s=i;
    30         }
    31         double Dist=dist(tmp,p[s]);
    32         ans=min(ans,Dist);
    33         tmp.x+=(p[s].x-tmp.x)/Dist*step;
    34         tmp.y+=(p[s].y-tmp.y)/Dist*step;
    35         tmp.z+=(p[s].z-tmp.z)/Dist*step;
    36         step*=0.99;
    37     }
    38     return ans;
    39 }
    40 
    41 int main(){
    42     int n;
    43     while(~scanf("%d",&n)){
    44         if(!n) break;
    45         for(int i=1;i<=n;i++){
    46             scanf("%lf %lf %lf",&p[i].x,&p[i].y,&p[i].z);
    47         }
    48         double ans=ac(n);
    49         printf("%.5f
    ",ans);
    50     }
    51 }
    View Code
  • 相关阅读:
    计算机控制技术课程动画课件资料等
    “工业4.0”下的可视化工厂建设方案
    UE4成批处理透明材质
    ROS_Kinetic_x 基於ROS和Gazebo的RoboCup中型組仿真系統(多機器人協作)
    UE4 C++与蓝图交互
    UE4联机烘焙
    临近毕业:AndroidVS大数据Java的offer,我到底应该怎么选?
    态度决定成败:大专毕业的我如何在25岁时拿到了阿里P6的offer?
    这13位专家关于kotlin的看法,80%移动开发人员都没听过
    Flutter 初学者到底需要怎样的Demo?
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/9809518.html
Copyright © 2011-2022 走看看