POJ 3737 UmBasketella (三分算法)

来源:互联网 发布:淘宝如何代理商品 编辑:程序博客网 时间:2024/05/18 20:11
/*

题意:给你一个圆锥体,圆锥底面积给出,问你圆锥的最大体积是多少。

思路:枚举底面圆半径,算圆锥的体积。可以列出表达式,满足三分,因此可以三分枚举底面圆半径

 函数:s=PI*(r+sqrt(r*r+h*h)),这样三分r或者h都可以求出另一个,我是算得r

*/

 

Source Code

Problem: 3737 User: imutzcyMemory: 200K Time: 0MSLanguage: C++ Result: Accepted

  • Source Code
    #include<functional>#include<algorithm>#include<iostream>#include<fstream>#include<sstream>#include<iomanip>#include<numeric>#include<cstring>#include<cassert>#include<cstdio>#include<string>#include<vector>#include<bitset>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<list>#include<set>#include<map>using namespace std;const double PI=acos(-1.0);const double eps=1e-6;double cal(double x,double s){       double R=(s-x*x*PI)/PI/x;       double H=sqrt(R*R-x*x);       return x*x*PI*H/3.0;}int main(){    double S;    while(~scanf("%lf",&S)){      double lp=0.0,rp=sqrt(S/PI);      double r=0.0;      while(lp+eps<rp){        double mid1=lp+(rp-lp)/3.0;        double mid2=rp-(rp-lp)/3.0;        double val1=cal(mid1,S);        double val2=cal(mid2,S);        if(val1>=val2){          rp=mid2;        }        else{          r=mid1;          lp=mid1;        }      }      double R=(S-PI*r*r)/(PI*r);      double H=sqrt(R*R-r*r);      double V=PI*r*r*H/3.0;      printf("%.2lf\n",V);      printf("%.2lf\n",H);      printf("%.2lf\n",r);    }    return 0;}

 

原创粉丝点击