题解 P3382 【【模板】三分法】

本题使用充满mo力的mo你退火
关于模拟退火,ta。。。
看到这单峰函数,猛地意识到模拟退火基本可以A掉,而灵魂代码

else
{
	if(exp(-now/temperature)*RAND_MAX>rand())
	{
		tx=X;
	}
}

是不需要的。。。(要也没事)

#include<bits/stdc++.h>
using namespace std;
int n;
double x[15];
double ansx,ans=-1e18-7,temperature;
double xs=0.995;
double L,R;
double calc(double X)
{
    double res=0,po=1;
    if(X<L||X>R)
	{
		return -1e18-7;
	}
    for(int i=n;i>=0;i--)
    {
    	res+=pow(X,i)*x[i];
    }
    return res;
}
void SA()
{
    double tx=ansx;
    temperature=1000;
    while(temperature>1e-14)
    {
        double X=ansx+temperature*(rand()*2-RAND_MAX);
        double now=calc(X)-ans;
        if(now>0)
        {
            tx=X;
            ans=calc(X);
            ansx=X;
        }
        else
        {
            if(exp(-now/temperature)*RAND_MAX>rand())
            {
                tx=X;
        	}
        }
        temperature*=xs;
    }
}
int main()
{
    cin>>n>>L>>R;
    for(int i=n;i>=0;i--)
    {
        cin>>x[i];
    }
    srand(time(NULL));
    ansx=(L+R)/2;
    SA();
    SA();
    SA();
    printf("%.5lf",ansx);
}
posted @ 2019-06-15 09:30  G_A_TS  阅读(448)  评论(0编辑  收藏  举报