首页 > 代码库 > UVA 1487 - Volume(积分)

UVA 1487 - Volume(积分)

UVA 1487 - Volume

题目链接

题意:给定r,h,求图中该图形体积

思路:积分题,用总面积减去重合体积,一个卦限重合体积为Dr2?h2??????,求得r2x?13x3,然后这个面积乘8就是总重合体积,但是注意题目中可能存在2r>h,对于这种情况实际上中间重合部分等于多一个立方体,求出该立方体高就能求出体积了,画图很容易看出高为r2?h22,算出重合体积再用总体积减去即可

代码:

#include <cstdio>
#include <cstring>
#include <cmath>

const double pi = acos(-1.0);
double r, h;

double f(double x) {
    return r * r * x - 1.0 / 3 * x * x * x;
}

double solve() {
    double tot = r * r * pi * h * 2;
    if (r * 2 <= h) return tot - (f(r) - f(0)) * 8;
    h /= 2;
    double H = sqrt(r * r - h * h);
    return tot - (h * h * H + f(r) - f(H)) * 8;
}

int main() {
    while (~scanf("%lf%lf", &r, &h)) {
	printf("%.4lf\n", solve());
    }
    return 0;   
}