POJ 3737 UmBasketella 三分法 入门题

来源:互联网 发布:vc高级编程 编辑:程序博客网 时间:2024/06/06 08:53

 

 二分法:适用于单调函数,单调增或单调减

三分法:适用于单峰凸性函数,如二次函数

缩写 l:left ,r: right , m1:mid 1,m2:mid2

三分法模板:

#define eps 10e-6double 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-6using 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);    }}

 

原创粉丝点击