题目:
Now, here is a fuction:<br> F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)<br>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<br>100<br>200
Sample Output
-74.4291<br>-178.8534题意:已知一方程F(x)=6*x^7+8*x^6+7*x^3+5*x^2-y*x求其最小值。解题思路:首先求导的导函数为:G(x)=42*x^6+48*x^5+21*x^2+10*x-y(0<=x<=100),令G(x)=0得y=42*x^6+48*x^5+21*x^2+10*x此函数很明显是一个单调递增的函数。由此可知若导函数的最大值小于0,那么原函数在区间内单调递减。即当x=100时最小;若函数的最小值大于0,那么原函数在区间内单调递增,即当x=0时最小。若导函数既有正又有负又由于导函数是单增函数,所以必有先负后正,即原函数必有先减后增的性质,再用二分的方法求出导函数的零点也就是原函数的最小值点,最后带入求解。#include<iostream> #include<cmath> #include<cstdio> #include<iomanip> #include<algorithm> using namespace std; double F(double x,double y) { return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x; } double f(double x) { return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x; } int main() { int t; double y,left,right,mid; cin>>t; while(t--) { cin>>y; left=0.0;right=100.0; while(right-left>1e-7) { mid=(left+right)/2; if(f(mid)<y) left=mid; else right=mid; } cout<<fixed<<setprecision(4)<<F(mid,y)<<endl; } return 0; }