hdu 5017 Ellipsoid 模擬退火算法模板

//109MS	304K
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

const double EPS = 1e-9;
const double INF = 1e18;
const double dx[8] = {1.0, 1.0, 0.0, -1.0, -1.0, -1.0, 0.0, 1.0};
const double dy[8] = {0.0, 1.0, 1.0, 1.0, 0.0, -1.0, -1.0, -1.0};
double a, b, c, d, e, f;

double dis(double x, double y, double z){
    return sqrt(x*x + y*y + z*z);
}

double getZ(double x, double y){
    double A = c, B = d*y + e*x, C = a*x*x + b*y*y + f*x*y - 1.0;
    double delta = B*B - 4.0*A*C;
    if(delta < 0.0) return INF;
    double z1 = (-B + sqrt(delta)) / (2.0 * A);
    double z2 = (-B - sqrt(delta)) / (2.0 * A);
    return z1*z1 < z2*z2 ? z1 : z2;
}

void work(){
    double x = 0.0, y = 0.0, z = getZ(x, y);
    double step = 0.8;
    while(step > EPS){
        for(int i=0; i<8; i++){
            double nx = x + dx[i]*step;
            double ny = y + dy[i]*step;
            double nz = getZ(nx, ny);
            if(nz >= INF) continue;
            if(dis(nx, ny, nz) - dis(x, y, z) < 0.0){
                x = nx, y = ny, z = nz;
            }
        }
        step *= 0.99;
    }
    printf("%.7f\n", dis(x, y, z));
}

int main(){
    while(scanf("%lf%lf%lf%lf%lf%lf", &a, &b, &c, &d, &e, &f) == 6){
        work();
    }
	return 0;
}

發佈了151 篇原創文章 · 獲贊 19 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章