Ellipsoid HDU-5017 模拟退火

Ellipsoid

在这里插入图片描述

solution

存在最优解,模拟退火

a x 2 + b y 2 + c z 2 + d y z + e x z + f x y = 1 ax^2+by^2+cz^2+dyz+exz+fxy=1 ax2+by2+cz2+dyz+exz+fxy=1

c z 2 + ( e x + d y ) z + ( a x 2 + b y 2 + f x y − 1 ) = 0 cz^2+(ex+dy)z+(ax^2+by^2+fxy-1)=0 cz2+(ex+dy)z+(ax2+by2+fxy1)=0

A = c A=c A=c

B = e x + d y B=ex+dy B=ex+dy

C = a x 2 + b y 2 + f x y − 1 C=ax^2+by^2+fxy-1 C=ax2+by2+fxy1

Δ = B 2 − 4 A C \Delta=B^2-4AC Δ=B24AC

z = − b + Δ 2 A , − b − Δ 2 A z=\frac{-b+\sqrt{\Delta}}{2A},\frac{-b-\sqrt{\Delta}}{2A} z=2Ab+Δ ,2AbΔ

d i s = x ∗ x + y ∗ y + m i n ( z 1 ∗ z 1 , z 2 ∗ z 2 ) dis=x * x + y * y + min(z_1*z_1,z_2*z_2) dis=xx+yy+min(z1z1,z2z2)

code

/*Siberian Squirrel*/
/*Cute JinFish*/
#include<bits/stdc++.h>

#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ACM_LOCAL

using namespace std;
typedef long long ll;

const double PI = acos(-1);
const double eps = 1e-8;
/*const int MOD = 998244353, r = 119, k = 23, g = 3;
const int MOD = 1004535809, r = 479, k = 21, g = 3;*/
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int M = 1e7 + 10;
const int N = 4e5 + 10;

int fx[5] = {0, 0, 1, -1};
int fy[5] = {1, -1, 0, 0};

int dcmp(double x) {
    if(fabs(x) < eps) return 0;
    else return x < 0? -1: 1;
}
//inline int rnd(){static int seed=2333;return seed=(((seed*666666ll+20050818)%998244353)^1000000007)%1004535809;}

double a, b, c, d, e, f;

double func(double x, double y) {
    double A = c, B = e * x + d * y, C = a * x * x + b * y * y + f * x * y - 1;
    double dleta = B * B - 4 * A * C;
    if(dleta < 0) return INF;
    double z1 = (-B + sqrt(dleta)) / (2 * A);
    double z2 = (-B - sqrt(dleta)) / (2 * A);
    return sqrt(x * x + y * y + min(z1 * z1, z2 * z2));
}

inline void solve(double res = 0, bool flag = false) {
    double x = sqrt(1.0 / a), y = 0;
    double t = 1.0, xx, yy;
    while(t > eps) {
        res = func(x, y);
        flag = false;
        for(int i = 0; i < 4; ++ i) {
            xx = x + t * fx[i];
            yy = y + t * fy[i];
            if(func(xx, yy) + eps < res) {
                flag = true;
                break;
            }
        }
        if(flag) x = xx, y = yy;
        else t *= 0.618;
    }
    res = func(x, y);
    cout << fixed << setprecision(10) << res << endl;
}


int main() {
    IO;
#ifdef ACM_LOCAL
    freopen("input", "r", stdin);
	freopen("output", "w", stdout);
#endif
    int o = 1;
//	cin >> o;
    while(o --) {
        while(cin >> a >> b >> c >> d >> e >> f)
            solve();
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值