您的位置:首页 > 其它

HDU 5060/BC 12C War

2015-08-10 16:00 218 查看
题目大意 给出一个以原点为中心的球的半径 和一个以原点为中心的圆柱的半径和高 求他们相交体积与总体积的比

总体积 是由球体积加圆柱体积减相交体积得到。

接下来说相交体积怎么求。

首先基础的几何 球体积是4/3πR³ 圆柱是πR²H

另外补充 球被平面切后形成的较小的部分叫球冠(自己定的义,并不严谨,只是方便大家理解) 球冠是有体积公式的π π(3R-h)×h²/3

你不知道公式也不要紧 可以积分手推一下 不会手推也不要紧 可以用simpson什么的积分函数帮你算 只要你能把原函数推出来就还可以玩

什么你还不会?那也没关系 去做D吧 C跟你无缘了。。。

言归正传 各部分的体积能求了 下面开始分情况讨论 分割成以上3种标准模型

当圆柱半径比球大时 很明显 相交体积就是球被切了之后剩下的 等于球-球冠 (圆柱高于求直径就不用减了)

圆柱半径比球小时 有点麻烦 圆柱很高时 即HZ>=R时 就是 圆柱 加个球冠 形状跟个矿泉水瓶子差不多(为我能想到一个正常的模型鼓掌)

而这时矿泉水瓶子中圆柱的高度是h=sqrt(R²-HR²) (画个剖面图 R HR 和h构成三角形 很好推出的 我就不画图了 懒~) 而球冠部分的高是R-h

而当圆柱高度 比刚刚推出的h小时 相交部分即圆柱

而当圆柱高度位于h和R直接是 形状是矿泉水瓶把盖子消去 体积是 圆柱加大球冠减小球冠

为了计算方便 我直接算的一半的体积 因为怕出精度问题 提前把π都约了

include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include<set>
#include<stack>
#define bug puts("bugbugbug");
using namespace std;
const double pai=acos(-1.0);
typedef long long ll;
double yuanguan(double r,double h)
{
    return (3*r-h)*h*h/3;
}
double yuanzhu(double r,double h)
{
    return r*r*h;
}
int main()
{
    double R,HR,HZ;
    while(~scanf("%lf%lf%lf",&R,&HR,&HZ))
    {
        double sum=(2*R*R*R/3+HZ*HR*HR);
        double ans;//chong he de bu fen
        if(HR<R)
        {
            double h=sqrt(R*R-HR*HR);
            if(HZ>R)
                ans=yuanzhu(HR,h)+yuanguan(R,R-h);
            else if(HZ<h)
                ans=yuanzhu(HR,HZ);
            else
                ans=yuanzhu(HR,h)+yuanguan(R,R-h)-yuanguan(R,R-HZ);
        }
        else
        {
            ans=2*R*R*R/3;
            if(HZ<R)
                ans-=yuanguan(R,R-HZ);
        }
        double lalala=ans/(sum-ans);
        printf("%.6lf\n",lalala);

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: