题解 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);
}