51Nod 1629 B君的圆锥
B君要用一个表面积为S的圆锥将白山云包起来。
B君希望包住的白山云体积尽量大,B君想知道体积最大可以是多少。
注意圆锥的表面积包括底面和侧面。
Input
一行一个整数,表示表面积S。(1 <= S <= 10^9)
Output
一行一个实数,表示体积。
Input示例
8
Output示例
1.504506
设l为母线长,r为底面半径长,ze有s=pi*r*r+pi*r*l==>l=s/(pi*r)-r且保证l>r所以有r<sqrt(s/(pi*2));
根据函数显示,体积不是单调函数,所以需要三分
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) typedef long long ll; double s; double solve(double x) { double l=s/(pi*x)-x; double h=sqrt(l*l-x*x); return pi*x*x*h/3; } int main() { scanf("%lf",&s); double l=0,r=sqrt(s/(pi*2)); while((r-l)>1e-7) { double midr=r-(r-l)/3; double midl=l+(r-l)/3; if(solve(midl)>=solve(midr)) r=midr; else l=midl; } printf("%.6lf\n",solve(l)); return 0; }