ZOJ 2369 | SGU 217 | Acdream 1234 自适应辛普森积分

来源:互联网 发布:超图软件股吧 编辑:程序博客网 时间:2024/05/16 07:44

题意:给你两个无限长的圆柱,其轴线相交且垂直,问你相交的体积是多大。

思路:shi哥说将一个轴固定在x上另一个在y上,那么从z轴上看其公共部分的切面,为一个矩形,长和宽分别为2*sqrt(r*r-z*z),2*sqrt(R*R-z*z),然后套神公式就好了。。。

#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <cctype>using namespace std;const double eps = 1e-8;double D, H, B, L;double r, R;double F(double x){    return 4 * sqrt((r * r - x * x) * (R * R - x * x));}double simpson(double a, double b){    double c = a + (b - a) / 2;    return (F(a) + 4 * F(c) + F(b)) * (b - a) / 6;}double asr(double a, double b, double eps, double A){    double c = a + (b - a) / 2;    double L = simpson(a, c), R = simpson(c, b);    if(fabs(L + R - A) <= eps) return L + R + (L + R - A) / 15;    return asr(a, c, eps / 2, L) + asr(c, b, eps / 2, R);}double asr(double a, double b, double eps){    return asr(a, b, eps, simpson(a, b));}void solve(){    if(r > R) swap(r, R);    printf("%lf\n", asr(0, r, 1e-8) * 2);}int main(){    while(~scanf("%lf%lf", &r, &R)) solve();    return 0;}
0 0
原创粉丝点击