zyh 说,要有模拟退火,于是乎,就有了这道题。(实际上是数学题吧)
身为模拟退火的板子题,在我写的时候我问了 zyh 一个小问题:直接枚举整数能不能行,zyh 说,估计不行。
然后就有了题解(伪)了是吗
强调函数不要写错,我写错了加减符号居然还有 分,调试半天不知道哪里错了。
总之就是嘎嘎乱退就好了,数据不是很强,我当时因为当时不知道为什么 WA 一个点之后出现了一个暴力作品。
指从 1e8 退到 1e-8,乘 0.999,然后每个测试点卡 0.9s。
刚刚稍微修改了一下,这份就顺眼很多了。
#include<bits/stdc++.h>
using namespace std;
double a,b,c,d,e,f;
double ans=0x3f3f3f3f;
double work(double x)
{
double y=a*sin(b*x+c)+d*cos(e*x+f);
ans=min(ans,y);
return y;
}
double rand(double x,double y)
{
if(int(y-x)==0)
return x+rand()/RAND_MAX;
return (rand()%int(y-x))+x+(double)rand()/RAND_MAX;
}
void tui()
{
double tmp=rand(-1000000,1000000);
for(double t=1e4;t>=1e-4;t*=0.99)
{
double nxt=rand(tmp-t,tmp+t);
double now=work(tmp),next=work(nxt);
double d=next-now;
if(exp(-d/t)>=(double)rand()/RAND_MAX)
tmp=nxt;
}
}
int main()
{
srand(time(0));
scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f);
for(int i=1;i<=100;i++)
tui();
printf("%lf",ans);
}
记得开 double,不然 you can try 一 try,再次缩小 大概率也可以过,反正嘎嘎退就完了。
共 1 条回复
tql