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