poj 3737 三分法_LiWang112358的空间

题目大意:给定圆锥的表面积,求{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;
}
感谢:鹤仙人的讲解


郑重声明:资讯 【poj 3737 三分法_LiWang112358的空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——