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代码:

View Code
#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);
    }
}

 

posted @ 2012-08-10 10:58  To be an ACMan  Views(419)  Comments(0)    收藏  举报