18 南京 D

时间:2023-03-09 18:13:26
18 南京 D

裸的最小球覆盖。

坐标范围大一些所以我们把初始的温度也设置的大一些。

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const db INF = 1e100;
const db delta = 0.98;
const db eps = 1e-;
struct p3{
db x,y,z;
p3 operator +(const p3&k1)const { return p3{x+k1.x,y+k1.y,z+k1.z};}
p3 operator -(const p3&k1)const { return p3{x-k1.x,y-k1.y,z-k1.z};}
p3 operator *(const db k1)const { return p3{x*k1,y*k1,z*k1};}
p3 operator /(const db k1)const { return p3{x/k1,y/k1,z/k1};}
db abs(){ return sqrt(x*x+y*y+z*z);}
db dis(p3 k1){ return (*this-k1).abs();}
};
int n;
p3 p[];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
}
db T = ;
db ans = INF;
p3 x = {,,};
while (T>eps){
db mx =;int id=-;
for(int i=;i<=n;i++){
if((p[i]-x).abs()>mx){
mx=(p[i]-x).abs();
id=i;
}
}
ans = min(ans,mx);
x=x+(p[id]-x)/mx*T;
T*=delta;
}
printf("%.11f\n",ans);
}