1. 程式人生 > >HDU 5017 模擬退火

HDU 5017 模擬退火

一步一步慢慢學習~~~

模擬退火大法好~~~

程式碼:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
const int N = 30 +5;
double a,b,c,d,e,f;
double dist(double x,double y,double z)
{
    return sqrt(x*x+y*y+z*z);
}
struct point
{
    double x;double y;double z;
    point() {}
    point(double a,double b,double c):x(a),y(b),z(c) {}
    double dis() {return dist(x,y,z);}
}p[N],pp[N];
int mox[]={-1,-1,-1,0,0 ,1 ,1,1};
int moy[]={-1,1 ,0 ,1,-1,-1,1,0};
bool check(double x,double y)
{
    double A = c;
    double B = d*y + e*x;
    double C = f*x*y + a*x*x + b*y*y - 1;
    if(B*B - 4*A*C < 0)
        return 0;
    else
        return 1;
}
double getZ(double x,double y)
{
    double A = c;
    double B = d*y + e*x;
    double C = f*x*y + a*x*x + b*y*y - 1;
    double dd = sqrt(B*B - 4*A*C);
    double z1 = (dd - B)/(2*A);
    double z2 = (-dd - B)/(2*A);
    if(dist(x,y,z1)<dist(x,y,z2))
        return z1;
    else
        return z2;
}
int main()
{
    while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f)!=EOF)
    {
        double ans = 1e20;
        double T = 1;
        double Tmin = 1e-8;
        double r = 0.99;
        p[1].x=0;p[1].y=0;p[1].z=sqrt(1.0/c);
        while(T>Tmin)
        {
            for(int i=1;i<=1;i++)
            {
                double tx = p[i].x, ty = p[i].y;
                for(int j=0;j<8;j++)
                {
                    double xx = tx + T*mox[j];
                    double yy = ty + T*moy[j];
                    if(check(xx,yy))
                    {
                        double zz = getZ(xx,yy);
                        if(dist(xx,yy,zz) < p[i].dis())
                        {
                            point temp(xx,yy,zz);
                            p[i]=temp;
                        }
                    }
                    ans = min(ans,p[i].dis());
                }
            }
            T*=r;
        }
        printf("%.7f\n",ans);
    }
    return 0;
}

程式碼寫的有些屎~~~~,沒辦法,自己太渣。

這道題因為精度WA了很多次,這也是模擬退火的著重點,注意!!!

相關推薦

HDU 5017 模擬退火

一步一步慢慢學習~~~ 模擬退火大法好~~~ 程式碼: #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<

HDU 3007 模擬退火算法

ise reat contain cnblogs sil area ide 3.0 tdi Buried memory Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/

HDU 3007 模擬退火演算法

Buried memory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4067  

HDU 4766 模擬退火(最小圓覆蓋) + 二分

#include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <iostream> #include <al

HDU 5017 Ellipsoid(退火模擬

Ellipsoid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 658    Accepted Submis

hdu 5017 Ellipsoid 模擬退火演算法 西安網路賽

For each test contains one line. Describes the minimal distance. Answer will be considered as correct if their absolute error is less than 10-5.比賽的時候想到的是用拉

HDU 5017 Ellipsoid(模擬退火

Sample Output 1.0000000 【思路分析】   求橢球面上的點到原點的最短距離。網上很多說是模擬退火,個人感覺此題區域性最優解就是全域性最優解,即結果是一個單峰函式,頂多算個爬山演算法。 程式碼如下:#include <iostream> #include <cstd

hdu 3932 Groundhog Build Home —— 模擬退火

scanf define std while typedef srand -s ans 代碼 題目:http://acm.hdu.edu.cn/showproblem.php?pid=3932 找一個位置使距離最遠的點的距離最小; 上模擬退火; 每次向距離最遠的點移動,註意

hdu 2899 Strange fuction——模擬退火

mes using cti () urn algorithm str turn i++ 題目:http://acm.hdu.edu.cn/showproblem.php?pid=2899 還可三分。不過只寫了模擬退火。 #include<iostream> #

HDU-3644 A Chocolate Manufacturer's Problem 計算幾何 模擬退火

HDU-3644 A Chocolate Manufacturer’s Problem 題意: 給定一個多邊形, 判斷這個多邊形中是否可以放入一個半徑為r的圓. 分析: 發現不知從何入手時就開始模擬退火吧. 隨機找出圓心座標, 主要就是判斷某個點是否在多邊形內. 這題wa和tl

hdu 2988 Strange fuction【模擬退火

計算:給出y ,    的最小值  wa到哭啊,簡直上火了,是板子沒有套對, nex=now+T*i;//新解 T*i是變化的範圍加上原先的才是新解, 還有精確度,因為評估函式要平方,所以要高一些 最終15ms &nbs

5017 Ellipsoid 模擬退火

Given a 3-dimension ellipsoid(橢球面)  your task is to find the minimal distance between the original point (0,0,0) and points on the ell

HDU-3644 A Chocolate Manufacturer's Problem 計算幾何 模擬退火

題意: 給定一個多邊形, 判斷這個多邊形中是否可以放入一個半徑為r的圓. 分析: 發現不知從何入手時就開始模擬退火吧. 隨機找出圓心座標, 主要就是判斷某個點是否在多邊形內. 這題wa和tle了好多次, 引數選擇需要些微調, 模擬退火有風險, 罰時傷不起

HDU 3007 Buried memory(點集最小圓覆蓋 模擬退火解法)

這題和ZOJ1450是一樣的,不過這個題目我換個解法 ZOJ1450我是用標準求最小點集覆蓋求圓的方法來做的,速度很快 對於這一題目,我用的是模擬退火思想,每次像正確結果逼近 不過精度一點也不好控制,還有step也一點也不好控制,這些值都不能隨便 取,要取特定意義的值才行

Hdu 2899 Strange fuction(二分三分可做,模擬退火解法)

題意:計算F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)的最小值 分析:求導發現0~100內為凹函式,那麼可以直接二分導數或者三分原函式, 這裡寫一下模擬退火的做法,每次左右找到較低函式值並轉移x,控制一下

模擬退火 (poj 2420, poj 2069)

mes 全局 poj include using div tracking out amp 模擬退火基本知識 其偽代碼例如以下: Let s = s0 For k = 0 through k_max (exclusive): T := temperature(k /

爬山算法和模擬退火算法簡介

出了 搜索算法 旅行 www cnblogs 所有 發的 圖1 貪心 轉自:http://www.cnblogs.com/chaosimple/archive/2013/06/10/3130664.html 一. 爬山算法 ( Hill Climbing )

【BZOJ3680】吊打XXX 模擬退火

esc 題解 ret 爬山 能量 truct style namespace ngx 【BZOJ3680】吊打XXX Description gty又虐了一場比賽,被虐的蒟蒻們決定吊打gty。gty見大勢不好機智的分出了n個分身,但還是被人多勢眾的蒟蒻抓住了。蒟蒻們

【BZOJ1844/2210】Pku1379 Run Away 模擬退火

tro pku str sqrt mes tchar 矩形 ron run 【BZOJ1844/2210】Pku1379 Run Away 題意:矩形區域中有一堆點,求矩形中一個位置使得它到所有點的距離的最小值最大。 題解:模擬退火的裸題,再調調調調調參就行了~

【BZOJ1038】【ZJOI2008】瞭望塔 [模擬退火]

輪廓 abs none i++ += edi bzoj1038 put continue 瞭望塔 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description   致