hdu2899 二分数学

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.
 

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 ;
}

猜你喜欢

转载自blog.csdn.net/frankax/article/details/79926411