题目大意:给定圆锥的表面积,求{zd0}体积,并输出底面半径和高。 其实可以推公式求极值,比较简单,但这次是{dy}次写三分法,觉的比较有用,特别是在那些函数很难推导的时候,只要函数有但极值,并且有明确的边界,就可以三分逼近。 假设现在的左右两端是a和b,那么计算x1=f(a+(b-a)/3)和x2=f(b-(b-a)/3) if x1>x2 b=x2 else a=x1 知道ab的差小于 设定的精度
代码: #include <iostream> #include <stdlib.h> #include <cmath> using namespace std; double const pi=acos(-1.0); double ans1,ans2,anst1,anst2,r1,r2,rmid1,rmid2,h1,h2,hmid1,hmid2,s; double p2(double x) { return x*x; } double work(double r,double & h) { double tmp; tmp=p2(s/(pi*r)); h=sqrt(tmp-2*s/pi); return pi*r*r*h/3; } int main(int argc, char *argv[]) { while (scanf("%lf",&s)!=EOF) { r1=ans1=h1=0; r2=sqrt(s/pi); ans2=work(r2,h2); do { rmid1=r1+(r2-r1)/3; rmid2=r2-(r2-r1)/3; anst1=work(rmid1,hmid1); anst2=work(rmid2,hmid2); if (anst1>anst2) { ans2=anst2; r2=rmid2; h2=hmid2; } else { ans1=anst1; r1=rmid1; h1=hmid1; } }while (fabs(anst1-anst2)>0.000000001); printf("%.2lf\n%.2lf\n%.2lf\n",anst1,hmid1,rmid1); } return 0; }
|