http://acm.hdu.edu.cn/showproblem.php?pid=2199
/*
二分查找;
*/
#include <iostream>
#include <cmath>
using namespace std;
double fun(double x)
{
return 8*pow(x,4.0)+7*pow(x,3.0)+2*pow(x,2.0)+3*x+6;
}
double l,m,r,y;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf",&y);
if(fun(0)<=y && y<=fun(100))
{
l = 0,r = 100;
while(r-l > 1e-6)
{
m = (l+r)/2;
double ans = fun(m);
if(ans > y)
{
r = m - 1e-7;
}
else
{
l = m + 1e-7;
}
}
m = (l+r)/2.0;
printf("%.4lf\n",m);
}
else
{
puts("No solution!");
}
}
}
http://acm.hdu.edu.cn/showproblem.php?pid=2899
/*
函数为 F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x;
那么它的导函数为 F'(x) = 42 * x^6+48*x^5+21*x^2+10*x-y;
设计函数,求函数 G'(x) = 42 * x^6+48*x^5+21*x^2+10*x 的值,将其减去输入的y值;
可以看出,函数G'(x)为单调递增函数;
如果对于100,G'(x) - y <= 0,那么对于任意数【0-100】,G'(x)都<=0,则F(100)为整个函数最小值;
否则,我们进行二分查找;代码:
*/
#include <iostream>
#include <cmath>
using namespace std;
double l,m,r,y;
double g(double x)
{
return 42*pow(x,6.0)+48*pow(x,5.0)+21*pow(x,2.0)+10*x;
}
double f(double x)
{
return 6.0*pow(x,7.0)+8.0*pow(x,6.0)+7.0*pow(x,3.0)+5.0*pow(x,2.0)-y*x;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf",&y);
if(g(100.0)-y>0)
{
l = 0,r = 100;
while(r-l > 1e-8)
{
m = (l+r)/2;
if(g(m) > y)
r = m - 1e-7;
else
l = m + 1e-7;
}
m = (l+r)/2.0;
printf("%.4lf\n",f(m));
}
else
printf("%.4lf\n",f(100.0));
}
}