题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2899
题意:给了你一个函数,然后给了你x的变化范围0到100,让你求出函数的最小值。
分析:它让你求的是函数的最小值,所以我们可以先对函数求导,得到的导数就可以判断函数的单调性了,求出导数后,我们发现如果函数的导数是x越大所求的的导数也就越大,
当导数一直为负数时,函数是单调递减的;当导数开始是负数,然后是正数,那说明函数开始时递减的然后是递增的,那么当导数为0时函数值肯定是最小的!我们求导数为0的
过程,我们可以用二分实现!
#include <bits/stdc++.h> #define eps 1e-7 //该常量为精度 #define F 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x #define DF 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y //导数,函数随着x增大单调递增 using namespace std; int main() { int n; double y; double x,l,r;//x为变量 cin>>n; while(n--) { cin>>y; l=0.0; r=100.0; while(r-l>=eps) { x=(l+r)/2;//范围的中间值 if(DF<0) {//当导数小于0,符合函数等于0的x一定在中间值的右边 l=x; } else if(DF>0) {//当导数大于0,符合函数等于0的x一定在中间值的左边 r=x; } else if(DF<eps) {//当DF小于最小精度时可近似认为导数值等于0了,即得到我们要求的x, break; } } printf("%.4lf\n",F); } }
原文:https://www.cnblogs.com/rtyxxy/p/12285460.html