codeforces106E 模拟退火

来源:互联网 发布:fgo日服石头号淘宝 编辑:程序博客网 时间:2024/06/02 02:19

找到最远点即可,每次朝那个方向退火即可。和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;}
原创粉丝点击