Strange fuction
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15738 Accepted Submission(s): 10341
Problem Description
Now, here is a fuction:
Can you find the minimum value when x is between 0 and 100.
Input
The first line of the input contains an integer T(1<=T<=100) which means the number of test cases. Then T lines follow, each line has only one real numbers Y.(0 < Y <1e10)
Output
Just the minimum value (accurate up to 4 decimal places),when x is between 0 and 100.
Sample Input
2
100
200
Sample Output
-74.4291
-178.8534
分析
本题是函数最值问题,这里采用模拟退火算法解决。该算法有初始温度T、结束温度eps,降温系数delta三个主要值。
代码
#include<iostream>
#include<cmath>
using namespace std;
const double eps=1e-8;
double y;
double func(double x){
return 6*pow(x,7.0)+8*pow(x,6.0)+7*pow(x,3.0)+5*pow(x,2.0)-y*x;
}
double solve()
{
double T=100;
double delta=0.98;
double x=50.0;
double now=func(x);
double ans=now;
int f[2]={1,-1};
while(T>eps){
double newx=x+f[rand()%2]*T;//按概率改变x,随T的降温而减少
if(newx>=0&&newx<=100){
double next=func(newx);
ans=min(ans,next);
if(now-next>eps) {
x=newx;now=next;
}
}
T*=delta;
}
return ans;
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%lf",&y);
printf("%.4f\n",solve());
}
return 0;
}