HDU_2899_Strange function
题意:求F(x)在区间[0,100]的最小值
思路:根据其一阶导函数可以判断F(x)在[0,100]上是凹函数,故可以用三分的方法求最小值,F(x)越小,则x越靠近最小值点。
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <algorithm>
#include <functional>
#define debug(x) cout << "--------------> " << x << endl
using namespace std ;
const double PI = acos (-1.0 );
const double eps = 1e-10 ;
const long long INF = 0x7fffffff ;
const long long MOD = 1000000007 ;
double fun(double x, double y)
{
return 6 *pow (x, 7 ) + 8 *pow (x, 6 ) + 7 *pow (x, 3 ) + 5 *x*x - y*x;
}
int main()
{
double y;
int T;
scanf ("%d" , &T);
while (T--)
{
scanf ("%lf" , &y);
double l = 0 , r = 100.0 , mid, mmid;
int cnt = 0 ;
while (r-l > eps)
{
mid = (l+r) / 2.0 ;
mmid = (mid + r) / 2.0 ;
fun(mmid, y) > fun(mid, y) ? r = mmid : l = mid;
}
fun(mmid, y) < fun(mid, y) ? printf ("%.4f\n" , fun(mmid, y)) : printf ("%.4f\n" , fun(mid, y));
}
return 0 ;
}