1 条题解

  • 0
    @ 2025-5-7 23:38:37

    题目分析

    本题描述了一只海狸啃树的场景。树的树干可看作直径为 (D) 的圆柱体,海狸啃食的部分高度也为 (D)。啃食后树干剩余部分由两个圆锥台和中间一个直径与高度相等的圆柱体组成。题目要求根据给定的树干直径 (D) 和海狸啃食的木材体积 (V),计算中间圆柱体的直径 (d)。

    输入输出分析

    • 输入:输入包含多组数据,每组数据占一行,包含两个整数 (D) 和 (V),分别表示树干直径和啃食的木材体积,用空格分隔。最后一行以 (D = 0) 和 (V = 0) 结束输入。
    • 输出:对于每组输入,输出一行,包含一个保留三位小数的数字,表示中间圆柱体的直径 (d)。

    数学原理

    设树干直径为 (D),中间圆柱体直径为 (d),海狸啃食的木材体积为 (V)。 树干原本的体积 $V_{total}=\pi\times(\frac{D}{2})^2\times D=\frac{\pi D^3}{4}$。 剩余部分(两个圆锥台和中间圆柱体)的体积 (V_{remaining}) 可通过公式推导得出,这里不详细展开推导过程,直接给出剩余部分体积与 (D) 和 (d) 的关系。经过推导,可得到: V=π4(D3d3)V=\frac{\pi}{4}(D^3 - d^3) 变形可得: d3=D36Vπd^3=D^3-\frac{6V}{\pi} 进而: d=D36Vπ3d=\sqrt[3]{D^3 - \frac{6V}{\pi}}

    代码解释

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    
    using namespace std;
    
    const double PI = acos(-1);
    
    int main()
    {
        double d, v;
        // 循环读取输入,直到输入为 0 0 时停止
        while(~scanf("%lf%lf", &d, &v) && (d || v)) {
            // 根据公式计算 d^3 的值
            double tmp = d * d * d - v * 6 / PI;
            // 计算 d 的值,使用对数和指数函数实现开立方根
            printf("%.3f\n", exp(log(tmp) / 3));
        }
    
        return 0;
    }
    
    • 常量定义constdoublePI=acos(1);const double PI = acos(-1); 定义了圆周率 (\pi) 的值。
    • 输入读取:使用 while( scanf("while(~scanf("%lf%lf", &d, &v) && (d || v)) 循环读取输入,直到输入的 (D) 和 (V) 都为 0 时停止。
    • 计算中间结果doubletmp=dddv6/PI;double tmp = d * d * d - v * 6 / PI; 根据公式 (d^3=D^3-\frac{6V}{\pi}) 计算 (d^3) 的值。
    • 计算并输出结果printf("printf("%.3f\n", exp(log(tmp) / 3)); 使用对数和指数函数实现开立方根,计算出 (d) 的值,并保留三位小数输出。

    复杂度分析

    • 时间复杂度:由于每组数据的计算是常数时间的,假设输入有 (n) 组数据,时间复杂度为 (O(n))。
    • 空间复杂度:只使用了常数级的额外空间,空间复杂度为 (O(1))。
    • 1

    信息

    ID
    1407
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者