熱門文章

2025年10月6日 星期一

ZeroJudge 解題筆記:f332. 貝瑞的鐵線體積

作者:王一哲
日期:2025年10月6日


ZeroJudge 題目連結:f332. 貝瑞的鐵線體積

解題想法


如果函數為 $y = f(x)$,將此函數曲線以 $x$ 軸為轉軸旋轉,旋轉體體積為 $$ V = \pi \int_a^b y^2 dx $$

Python 程式碼


使用時間約為 22 ms,記憶體約為 3.4 MB,通過測試。
import math

t = int(input())  # 共 t 筆測資
for _ in range(t):  # 執行 t 次
    n = int(input())  # 多項式最高次方
    poly = list(map(int, input().split()))  # 多項式由高到低次方各項係數
    square = [0]*(2*n + 1)  # 多項式平方各項係數
    for i in range(n+1):
        for j in range(n+1):
            square[i+j] += poly[i]*poly[j]
    integral = [0]*(2*n + 1)  # 平方後積分結果,忽略常數項
    for i in range(2*n + 1):  # 計算積分式
        integral[i] = 1.0 * square[i] / (2*n + 1 - i)
    ans = 0.0  # 積分結果
    a, b = map(int, input().split())  # 積分下限、上限
    for i, c in enumerate(integral):  # 代入積分下限、上限
        ans += c * (b**(2*n + 1 - i) - a**(2*n + 1 - i))
    print(f"{math.pi*ans:.2f}")  # 印出答案時再乘以 pi


C++ 程式碼


要用 double,不能用 float,而且 pi 的位數要取多一點。使用時間約為 2 ms,記憶體約為 160 kB,通過測試。
#include <cstdio>
#include <cmath>
using namespace std;

int main() {
    int t; scanf("%d", &t);  // 共 t 筆測資
    while(t--) {  // 執行 t 次
        int n; scanf("%d", &n);  // 多項式最高次方
        int poly[n+1];  // 多項式由高到低次方各項係數
        for(int i=0; i<=n; i++) scanf("%d", &poly[i]);
        int square[2*n + 1] = {0};  // 多項式平方各項係數
        for(int i=0; i<=n; i++) {
            for(int j=0; j<=n; j++) {
                square[i+j] += poly[i]*poly[j];
            }
        }
        double integral[2*n + 1];  // 平方後積分結果,忽略常數項
        for(int i=0; i<=2*n; i++) {  // 計算積分式
            integral[i] = 1.0 * square[i] / (2*n + 1 - i);
        }
        double ans = 0.0;  // 積分結果
        int a, b; scanf("%d %d", &a, &b);  // 積分下限、上限
        for(int i=0; i<=2*n; i++) {  // 代入積分下限、上限
            ans += integral[i] * (pow(b, 2*n + 1 - i) - pow(a, 2*n + 1 - i));
        }
        printf("%.2f\n", 3.141592653589793*ans);  // 印出答案時再乘以 pi
    }
    return 0;
}


沒有留言:

張貼留言