题目链接:http://poj.org/problem?id=3737
题目大意:已知圆锥表面积
n
,求圆锥体积
思路:圆锥体积
然后三分的过程比较简单,类似二分,若
val1<val2
,则
lowerBound=mid1
,否则
upperBound=mid1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <cmath>
#define PI (3.1415926535897384626)
#define EPS (1e-7)
using namespace std;
double S; //圆锥的表面积
double calc(double r) //已知圆锥底面半径r,计算当前圆锥的体积
{
double R=(S-PI*r*r)/PI/r; //侧面展开的扇形半径
double h=sqrt(R*R-r*r); //
return PI*r*r*h/3;
}
int main()
{
while(scanf("%lf",&S)!=EOF)
{
double lowerBound=0,upperBound=sqrt(S/PI);
double mid1,mid2,val1,val2;
while(lowerBound+EPS<upperBound)
{
mid1=lowerBound+(upperBound-lowerBound)/3;
mid2=upperBound-(upperBound-lowerBound)/3;
val1=calc(mid1);
val2=calc(mid2);
if(val1<val2) lowerBound=mid1;
else upperBound=mid2;
}
double R=(S-PI*upperBound*upperBound)/PI/upperBound; //圆锥的侧面展开后的扇形半径
double h=sqrt(R*R-upperBound*upperBound); //最终的圆锥高度
double V=PI*upperBound*upperBound*h/3; //最终的圆锥最大体积
printf("%.2f\n%.2f\n%.2f\n",V,h,upperBound);
}
return 0;
}