1629 B君的圆锥
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
B君要用一个表面积为S的圆锥将白山云包起来。
B君希望包住的白山云体积尽量大,B君想知道体积最大可以是多少。
注意圆锥的表面积包括底面和侧面。
Input
一行一个整数,表示表面积S。(1 <= S <= 10^9)
Output
一行一个实数,表示体积。
Input示例
8
Output示例
1.504506
给出表面积S 求圆锥的最大体积V 数学题
S=PI*r^2+PI*r*L //①
V=PI*r^2*h/3 //②
h=sqrt(L^2-r^2) //③
由①得L=(S-PI*r^2)/(PI*r) //④
将④③代入②得3*V=PI*r^2*sqrt( ((S-PI*r^2)/(PI*r))^2-r^2)
<=>3*V=r*sqrt((S-PI*r^2)^2-PI^2*r^4))
<=>3*V=r*sqrt(S^2-2*S*PI*r^2)
<=>3*V=sqrt(S^2*k-2*PI*S*k^2) //k=r^2
问题转化为求S^2*k-2*PI*S*k^2
最大值
显然当k=-b/(2*a)时有最大值 k=S/(4*PI)
代入并化简得:V=S*sqrt(S/(2*PI))/6
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<time.h>
#include<math.h>
#include<list>
#include<cstring>
//#include<memory.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define INF 1000000007
#define pll pair<ll,ll>
#define pid pair<int,double>
#define sci(a) scanf("%d",&a)
#define scll(a) scanf("%lld",&a)
#define scd(a) scanf("%lf",&a)
#define scs(a) scanf("%s",a)
#define pri(a) printf("%d\n",a)
#define prll(a) printf("%lld\n",a)
#define prd4(a) printf("%.4lf\n",a)
#define prd(a) printf("%lf\n",a)
#define prs(a) printf("%s\n",a)
//#define CHECK_TIME
double const PI=4*atan(1);
int main()
{
//freopen("/home/lu/文档/r.txt","r",stdin);
//freopen("/home/lu/文档/w.txt","w",stdout);
#ifdef CHECK_TIME
time_t now=clock();
#endif
int s;
sci(s);
prd(s/6.0*sqrt(s/2.0/PI));
#ifdef CHECK_TIME
cout<<"cost time:"
<<(double)(clock()-now)/CLOCKS_PER_SEC*1000
<<"ms"<<endl;
#endif
return 0;
}