正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-S 2021 第一轮真题 › 第21题

CSP-S 2021 第一轮 第21题:这段代码的含义为

阅读程序·单选 · 初等数学与数学库函数 · 答案 C

题目

#include <iostream>
#include <cmath>
using namespace std;

const double r = acos(0.5);

int a1, b1, c1, d1;
int a2, b2, c2, d2;

inline int sq(const int x) { return x * x; }
inline int cu(const int x) { return x * x * x; }

int main()
{
    cout.flags(ios::fixed);
    cout.precision(4);

    cin >> a1 >> b1 >> c1 >> d1;
    cin >> a2 >> b2 >> c2 >> d2;

    int t = sq(a1 - a2) + sq(b1 - b2) + sq(c1 - c2);

    if (t <= sq(d2 - d1)) cout << cu(min(d1, d2)) * r * 4;
    else if (t >= sq(d2 + d1)) cout << 0;
    else {
        double x = d1 - (sq(d1) - sq(d2) + t) / sqrt(t) / 2;
        double y = d2 - (sq(d2) - sq(d1) + t) / sqrt(t) / 2;
        cout << (x * x * (3 * d1 - x) + y * y * (3 * d2 - y)) * r;
    }
    cout << endl;
    return 0;
}

假设输入的所有数的绝对值都不超过 $1000$ ,完成下面的判断题和单选题:

本小题

(2.5 分)这段代码的含义为( )。

选项

  • A. 求圆的面积并
  • B. 求球的体积并
  • C. 求球的体积交
  • D. 求椭球的体积并

答案

C

题解

第⑥题选 C:求球的体积交,即两个球重叠部分的体积。

把 (a1, b1, c1)、(a2, b2, c2) 看作两个球的球心,d1、d2 看作半径。第 21 行的 t 就是两球心距离的平方。另外, \[ r=\arccos(0.5)=\frac{\pi}{3}. \]

程序分三种情况:

  • 一个球包含另一个球:球心距离不超过两半径之差的绝对值,重叠体积就是小球体积,即第 23 行的 \(\frac43\pi\min(d_1,d_2)^3\)。
  • 两个球外离或外切:球心距离不小于两半径之和,重叠体积为 \(0\),对应第 24 行。
  • 两个球部分重叠:重叠部分由两个球冠组成,x、y 是球冠的高度。利用球冠体积公式

\[ V=\frac{\pi}{3}h^2(3R-h), \] 第 28 行把两个球冠的体积相加。

尤其是“两球分开时输出 \(0\)”这一点,可以直接排除求体积并的选项。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号