ZOJ 3550 Big Keng
_(:3」∠)_
对于任意的V,要使表面积最小,H,R,h,r会符合一定的比例关系。
然后算得 表面积=C*(V的2/3次方) C为一常数。
故设V=1的时候算出C值。
对于R,V1(上面圆柱的体积),r而言,这个奇怪的组合体的表面积的函数都为单峰函数,然后三分R,再在里面三分V1,再在里面三分r,算出H和h的值,更新最小表面积。
//通过这个计算常数C #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #define eps 1e-9 using namespace std; const double pi=acos(-1); double v=1.0; double ans=9999999; double calr(double R2,double R1,double V1) { double sum=(V1/(pi*R1*R1))*2*pi*R1; double V2=v-V1; double H=V1/(pi*R1*R1); double h=(3*V2)/((R1*R1+R1*R2+R2*R2)*pi); sum+=(R1+R2)*pi*(sqrt((R1-R2)*(R1-R2)+h*h)); sum+=pi*R2*R2; ans=min(sum,ans); return sum; } double calV(double V1,double R1) { double L=0,R=R1; double lmid,rmid; while((R-L)>=eps) { lmid=(2*L+R)/3.0; rmid=(L+2*R)/3.0; if(calr(lmid,R1,V1)<calr(rmid,R1,V1)) R=rmid; else L=lmid; } return calr(lmid,R1,V1); } double calR(double R1) { double L=0,R=v; double lmid,rmid; while((R-L)>=eps) { lmid=(2*L+R)/3.0; rmid=(L+2*R)/3.0; if(calV(lmid,R1)<calV(rmid,R1)) R=rmid; else L=lmid; } return calV(lmid,R1); } int main() { double L=0,R=1000000; double lmid,rmid; while((R-L)>=eps) { lmid=(2*L+R)/3.0; rmid=(L+2*R)/3.0; if(calR(lmid)<calR(rmid)) R=rmid; else L=lmid; } printf("%.12lf\n",ans); } //算得常数C=3.939773107886 故AC代码为: #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> using namespace std; int main() { double hehe=3.939773107886; double v; while(cin>>v) { printf("%.7lf\n",hehe*pow(v,2.0/3.0)); } }