POJ 3737 UmBasketella 三分法 入门题
二分法:适用于单调函数,单调增或单调减
三分法:适用于单峰凸性函数,如二次函数
缩写 l:left ,r: right , m1:mid 1,m2:mid2
三分法模板:
#define eps 10e-6 double cal(){}//计算题目所需要的值 while(l+eps<r) { m1=l+(r-l)/3; m2=r-(r-l)/3; v1=cal(m1); v2=cal(m2); if(v1<v2)l=m1; else r=m2; }
AC代码:

#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #define eps 10e-6 using namespace std; const double pi = acos(double(-1)); double S; double cal(double r) { double R = S/pi/r-r; double h = sqrt(R*R-r*r); return h*pi*r*r/3; } int main() { while(~scanf("%lf",&S)) { double l= 0,r= sqrt(S/pi); double m1,m2,v1,v2; while(l+eps<r) { m1=l+(r-l)/3; m2=r-(r-l)/3; v1=cal(m1); v2=cal(m2); if(v1<v2)l=m1; else r=m2; } double R = S/pi/r-r; double h = sqrt(R*R-r*r); double V = h*pi*r*r/3; printf("%.2f\n%.2f\n%.2f\n",V,h,r); } }