1. 程式人生 > >HDU 3668 View Code (二重積分)

HDU 3668 View Code (二重積分)

大體題意:

求圖中交叉圓柱體的體積!

思路:

真是充分反映了高數能力!  是真弱啊,,想了6,7個小時了,才想明白! = =T_T!!!!

大體思路很明確,把兩個圓柱的體積加起來 減去中間公共部分的即可!

第一步首先得想到公共部分是一個怎樣的圖形。

這個在高數下冊例題中有講到!

中間實線部分就是第一卦限內的圖形,顯然一個二重積分就可以搞定:

這種情況比較簡單點,適合於2*R <= h 的時候!

如果2*R > h話!

需要加點想象力,中間公共部分 是一個長方體 加上兩個小突起

也是把他分成8份,只算第一卦限內的。

把他放到座標系裡 與上一個圖相比,沒什麼變換 只是將上一個圖沿x軸平移了h/2 個單位,而0~h/2這片區域是一個長方體!

這樣只需改變積分上下限即可!公式不變!(這裡想了很久)

詳細見程式碼:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps = 1e-8;
const double pi = acos(-1.0);
int main(){
    double r,h;
    while(scanf("%lf %lf",&r,&h) == 2){
        if (2*r > h + eps){
            double a = sqrt(r*r-h*h/4);
//            printf("%lf\n",a);
            double V = 2*pi*r*r*h;
            double other = h*h*a/4 + r*r*r*2/3  + (a)*(a)*(a)/3 - r*r*a;
            double ans = V-8.0*other;
            printf("%.4lf\n",ans+eps);

        }else{
            double V = 2*pi*r*r*h;
            double other = 8*2*r*r*r/3;
            double ans = V-other;
            printf("%.4lf\n",ans+eps);
        }
    }

    return 0;
}