zoukankan      html  css  js  c++  java
  • 2018ICPC南京D. Country Meow

    题目:

    题意:三维里有n个点,找一个最小的球将所有点覆盖。

    题解:退火法模拟的一道板子题。

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <math.h>
     4 using namespace std;
     5 const int MAXN=105;
     6 const double EPS=1e-8;
     7 struct Point{
     8     double x,y,z;
     9     Point(double _x=0,double _y=0,double _z=0){
    10         x=_x;y=_y;z=_z;
    11     }
    12 };
    13 Point Dots[MAXN];
    14 int n;
    15  
    16 double Distance(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 double Solve(){
    20     double Step=100000,ans=1e9,mt;
    21     Point z=Point(0.0,0.0,0.0);
    22     int s=0;
    23     while(Step>EPS){
    24         for(int i=1;i<=n;++i){
    25             if(Distance(z,Dots[s])<Distance(z,Dots[i])){
    26                 s=i;
    27             }
    28         }
    29         mt=Distance(z,Dots[s]);
    30         ans=min(ans,mt);
    31         z.x+=(Dots[s].x-z.x)/mt*Step;
    32         z.y+=(Dots[s].y-z.y)/mt*Step;
    33         z.z+=(Dots[s].z-z.z)/mt*Step;
    34         Step*=0.98;
    35     }return ans;
    36 }
    37 int main(){
    38 
    39         scanf("%d",&n);
    40         
    41         for(int i=1;i<=n;++i){
    42             double x,y,z;scanf("%lf%lf%lf",&x,&y,&z);
    43             Dots[i]=Point(x,y,z);
    44         }
    45         printf("%.15f",Solve());
    46     
    47 }
    View Code

     这题一开始没仔细看题只看了输出就被吓到了(还没学到立体几何)以为很难,后面没题可做了队友hcc发现就是一个最小球覆盖问题,然后我回忆起来前几天看到了这个板子就这套了一下就A了。

  • 相关阅读:
    软件工程实践 2017 第二次作业(部分)
    2017 软件工程实践第一次作业-031502627
    struct与class区别联系(转)
    个人作业——软件工程实践总结作业
    个人作业——软件产品案例分析
    个人技术博客(α)
    结对作业2
    软工作业2
    软工作业1
    作业7 学期总结
  • 原文地址:https://www.cnblogs.com/zpj61/p/13472807.html
Copyright © 2011-2022 走看看