第一次写这样的题目,写出来很有成就感啊。用二分法和牛顿迭代法都可以解决。题目:
2 100 200
-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; }
#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; }