//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;
}
hdu 5017 Ellipsoid 模擬退火算法模板
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.