链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2899
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4802 Accepted Submission(s): 3427
Problem Description
Now, here is a fuction:
F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)
Can you find the minimum value when x is between 0 and 100.
F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (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
F'(x) = 42 * x^6+48*x^5+21*x^2+10*x-y
42 * x^6+48*x^5+21*x^2+10*x = y
x 要是 double 类型的, 左边要尽可能接近右边的 y 值
再带入F(x)中
F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x
代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define N 150 #define D (1e-6) double f(double x) { return 42*pow(x, 6.0) + 48*pow(x, 5.0) + 21*pow(x, 2.0) + 10*x; } 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); } int main() { int t; scanf("%d", &t); while(t--) { int y; scanf("%d", &y); if(y>=f(100)) printf("%.4f ", F(100)-100*y); else { double L=0, R=100, m; while(R-L>D) { m = (L+R)/2; if(f(m)<=y) L=m; else R=m; } printf("%.4f ", F(L)-L*y); } } return 0; }