这道题我可能是第一个闲着蛋疼用梯度下降法做的。
众所周知,这是一个看脸的算法,要精细地调整学习率,还得祈祷到一个好的出生点
于是乎,我调了8次才通过,有几次是梯度算错了,还有几次学习率没调好,希望不要被判定为滥用评测资源
#include<bits/stdc++.h>
#define EPS 1e-3
using namespace std;
double a,b,c,d;
inline double calcValue(const double &x)
{
return (a*x*x*x+b*x*x+c*x+d)*(a*x*x*x+b*x*x+c*x+d);
}
inline double calcDerivative(const double &x)
{
return (2*(a*x*x*x+b*x*x+c*x+d))*(3*a*x*x+2*b*x+c);
}
inline double findTrough(const double &start,const double &learningRate)
{
double ans=start;
while(fabs(calcDerivative(ans))>EPS)
ans=ans-calcDerivative(ans)*learningRate;
return ans;
}
inline void init()
{
srand(time(0));
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
}
inline void solve()
{
vector<double> ans;
while(ans.size()<3)
{
double re=findTrough(rand()/(double)(RAND_MAX)*200.0-100.0,0.0001);
if(fabs(calcValue(re))<=EPS)
{
bool flag=1;
for(vector<double>::const_iterator i=ans.begin();i!=ans.end();i++)
if(fabs(re-*i)<1.0)
{
flag=0;
break;
}
if(flag)
ans.push_back(re);
}
}
sort(ans.begin(),ans.end());
for(vector<double>::const_iterator i=ans.begin();i!=ans.end();i++)
printf("%.2lf ",*i);
}
int main()
{
init();
solve();
return 0;
}