第一次写这样的题目,写出来很有成就感啊。用二分法和牛顿迭代法都可以解决。题目:
Strange fuction
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 739 Accepted Submission(s): 566
Problem Description
Now, here is a fuction:
F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)
Can you find the minimum value when x is between 0 and 100.
F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)
Can you find the minimum value when x is between 0 and 100.
Input
The first line of the input contains an integer T(1<=T<=100) which means the number of test cases. Then T lines follow, each line has only one real numbers Y.(0 < Y <1e10)
Output
Just the minimum value (accurate up to 4 decimal places),when x is between 0 and 100.
Sample Input
2 100 200
Sample Output
-74.4291 -178.8534
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
double ee=1e-10;
double y;
double mi(double s,int x){
double ss=1.00000000;
for(int i=1;i<=x;++i)
ss*=s;
return ss;
}
double f(double x){
return 42*mi(x,6)+48*mi(x,5)+21*mi(x,2)+10*x-y;
}
double ff(double x){
return 252*mi(x,5)+240*mi(x,4)+42*x+10;
}
double solve(double x){
return 6*mi(x,7)+8*mi(x,6)+7*mi(x,3)+5*mi(x,2)-y*x;
}
int main(){
int numcase;
scanf("%d",&numcase);
while(numcase--){
scanf("%lf",&y);
double fx=f(0.00000000);
double fy=ff(0.00000000);
double fz=0.00000000-fx/fy;
double ans=0.00000000;
while(abs(fz-ans)>ee){
ans=fz;
fx=f(fz);
fy=ff(fz);
fz=fz-fx/fy;
}
double newans=solve(ans);
printf("%.4lf\n",newans);
}
return 0;
}
二分法ac代码:
#include <iostream>
#include <cstdio>
using namespace std;
double ee=1e-10;
double mi(double s,int x){
double ss=1.00000000;
for(int i=1;i<=x;++i)
ss*=s;
return ss;
}
double binary_search(double x){
double ll=0.00000000,rr=100.00000000;
double mid;
double mm,nn;
while(rr-ll>ee){
mid=(ll+rr)/2.0;
mm=42*mi(mid,6)+48*mi(mid,5)+21*mi(mid,2)+10*mid;
nn=mm-x;
if(nn>ee)
rr=mid;
else if(nn<ee)
ll=mid;
else if(nn==ee)
break;
}
return mid;
}
double solve(double x,double ss){
return 6*mi(x,7)+8*mi(x,6)+7*mi(x,3)+5*mi(x,2)-ss*x;
}
int main(){
int numcase;
double y;
scanf("%d",&numcase);
while(numcase--){
scanf("%lf",&y);
double ans=binary_search(y);
double mmax=0.0;
if(mmax>solve(100.000,y))
mmax=solve(100.000,y);
if(mmax>solve(ans,y))
mmax=solve(ans,y);
printf("%.4lf\n",mmax);
}
return 0;
}