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;
}

猜你喜欢

转载自www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/8975917.html
今日推荐