题意:找到当x取值在0到100是F(x)的最小值。
思路:感觉这就是一道数学题,F(x)在[0,100]内的的最小值即为拐点(一阶导数为0),再用二分找一下答案就行了。
代码实现:
#include<stdio.h>
typedef long long ll;
const double rp=1e-7;
ll y;
double f(double x)
{
return 42*x*x*x*x*x*x+48*x*x*x*x*x+21*x*x+10*x-y;
}
double F(double x)
{
return 6*x*x*x*x*x*x*x+8*x*x*x*x*x*x+7*x*x*x+5*x*x-y*x;
}
int main()
{
int t; scanf("%d",&t);
while(t--)
{
scanf("%lld",&y);
double l=0,r=100,mid;
while(r-l>rp)
{
mid=(l+r)/2;
if(f(mid)-0>=rp) r=mid;
else l=mid;
}
printf("%.4f\n",F(l));
}
return 0;
}
同理也可以练习HDU的2199题
[2199.Can you solve this equation?]
AC代码:
#include<bits/stdc++.h>
using namespace std;
const double p=1e-7;
double f(double x)
{
return 8*x*x*x*x+7*x*x*x+2*x*x+3*x+6;
}
int main()
{
int T; cin>>T;
double y;
while(T--)
{
scanf("%lf",&y);
if(6-y>p||y-f(100.0)>p){
printf("No solution!\n");
continue;
}
double l=0,r=100;
while(r-l>p)
{
double mid=(l+r)/2;
if(f(mid)-y>=p) r=mid;
else l=mid;
}
printf("%.4f\n",r);
}
return 0;
}
931

被折叠的 条评论
为什么被折叠?



