找到最远点即可,每次朝那个方向退火即可。和2C还不太一样。
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
typedef long long LL;
const LL maxn = 3300;
const double eps = 1e-8;
double r;
int n;
struct Point {
double x, y, z;
void in() {
scanf("%lf%lf%lf", &x, &y, &z);
}
};
Point operator - (Point a, Point b) {
return {a.x - b.x, a.y - b.y, a.z - b.z};
}
vector<Point> V;
double Length2(Point a) {
return a.x*a.x+a.y*a.y+a.z*a.z;
}
int main(){
double x, y, z, delta = 1;
int best = -1;
scanf("%d", &n);
x = y = z = 0;
for(int i = 0; i < n; i++) {
Point tmp;
tmp.in();
V.push_back(tmp);
x += tmp.x, y += tmp.y, z += tmp.z;
}
x /= n, y /= n, z /= n;
while(delta > eps) {
double maxv = -1;
int best = -1;
for(int j = 0; j < n; j++) {
double tt = (V[j].x-x)*(V[j].x-x)+(V[j].y-y)*(V[j].y-y)+(V[j].z-z)*(V[j].z-z);
if(tt > maxv) {
maxv = tt;
best = j;
}
}
delta *= 0.999;
x = x + delta*(V[best].x-x);
y = y + delta*(V[best].y-y);
z = z + delta*(V[best].z-z);
}
printf("%.10f %.10f %.10f", x+eps, y+eps, z+eps);
return 0;
}