题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2899
用模拟退火求最值,得到可行解,但不是精确解。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const double EPS = 1e-8;
double y;
double F(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;
}
int main(void) {
int t; scanf("%d", &t);
while (t--) {
scanf("%lf", &y);
double T = 100, delta = 0.98, x = 50.0;
double now = F(x), ans = now;
while (T > EPS) {
int f[2] = { 1,-1 };
double newx = x + f[rand() % 2] * T;//50%的几率
if (newx >= 0 && newx <= 100) {
double next = F(newx);
ans = min(ans, next);
if (now - next > EPS) {//值小则状态更优
x = newx; now = next;
}
}
T *= delta;
}
printf("%.4lf\n", ans);
}
return 0;
}