Strange fuction
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9155 Accepted Submission(s): 6236
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
思路:求导得42.0 * pow(x,6) + 48*pow(x,5) + 21*pow(x,2) + 10*x - y ,那么此式子 = 0 时原函数最小。二分可解。得出的不是答案,还需要带入原函数得出结果。
Code:
#include <bits/stdc++.h> #define LL long long #define INF 1e-6 using namespace std; double y; double f ( double x ){ double ans = 42.0 * pow(x,6) + 48*pow(x,5) + 21*pow(x,2) + 10*x; return ans ; } double res( double x , double y ){ double ans = 6 * pow(x,7) + 8 *pow(x,6) + 7*pow(x,3) + 5 *x*x - y*x; return ans ; } int main(){ int n; cin >> n ; while( n-- ){ cin >> y ; double l = 0.0 , r = 100.0; while( r - l > 1e-7 ){ double mid = ( l + r ) / 2.0; double re = f(mid); if( re > y ){ r = mid - 1e-7; }else{ l = mid + 1e-7 ; } } printf("%.4lf\n", res( ((l+r)/2.0),y) ); } return 0 ; }