Now, here is a fuction:
F(x) = 6 * x7+8*x6+7x3+5*x2-yx (0 <= x <=100)
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
题解:
二分
求导,找驻点
解法同此题,点此链接
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
double fun(double x, double y) {//导数求驻点
return 42 * pow(x, 6) + 48 * pow(x, 5) + 21 * pow(x, 2) + 10 *x - y;
}
double func(double x,double y) {//代入求最小
return 6 * pow(x, 7) + 8 * pow(x, 6) + 7 * pow(x, 3) + 5 * pow(x, 2) - y * x;
}
int main() {
int T;
cin >> T;//cases
while (T--) {
double y;
cin >> y;//方程中的y
double left = 0.0;
double right = 100.0;
double mid = (left + right) / 2;
while (fabs(fun(mid,y)) > 1e-5) {
mid = (left + right) / 2;
double flag = fun(mid, y);
if (flag > 0) {
right= mid;
}
else {
left = mid;
}
}
double anwser = func(mid, y);
printf("%.4f\n", anwser);
}
return 0;
}