题解(真)

long_hao 2022-10-31 22:02:55 2022-10-31 22:10:00

zyh 说,要有模拟退火,于是乎,就有了这道题。(实际上是数学题吧)

身为模拟退火的板子题,在我写的时候我问了 zyh 一个小问题:直接枚举整数能不能行,zyh 说,估计不行。

然后就有了题解(伪)了是吗

强调函数不要写错,我写错了加减符号居然还有 90 分,调试半天不知道哪里错了。

总之就是嘎嘎乱退就好了,数据不是很强,我当时因为当时不知道为什么 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,再次缩小 t 大概率也可以过,反正嘎嘎退就完了。

共 1 条回复

Laffey

tql