HDU2899 Strange function 求函数最小值
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
double y;
double func(double x){
return (6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x);
}
double solve(){
double T=100;
double delta=0.98;
double x=50.0;
double now=func(x);
double ans=now;
while(T>eps){
int f[2]={-1,1};
double newx=x+f[rand()%2]*T;
if(newx<=100&&newx>=0){
double next=func(newx);
ans=min(ans,next);
if(now-next>eps) {x=newx;now=next;} //一定概率内容忍新数值
}
T*=delta;//乱跳。跳的距离越来越短
}
return ans;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lf",&y);
printf("%.4lf\n",solve());
}
}