2021年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第1题)

2021年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第1题)

第1题
cpp 复制代码
01 #include <iostream>
02 #include <cmath>
03 using namespace std;
04
05 const double r = acos(0.5);
06
07 int a1, b1, c1, d1;
08 int a2, b2, c2, d2;
09
10 inline int sq(const int x) { return x * x; }
11 inline int cu(const int x) { return x * x * x; }
12
13 int main()
14 {
15    cout.flags(iostream::fixed);
16    cout.precision(4);
17
18    cin >> a1 >> b1 >> c1 >> d1;
19    cin >> a2 >> b2 >> c2 >> d2;
20
21    int t = sq(a1 - a2) + sq(b1 - b2) + sq(c1 - c2);
22
23    if (t <= sq(d2 - d1)) cout << cu(min(d1, d2)) * r * 4;
24    else if (t >= sq(d2 + d1)) cout << 0;
25    else {
26    double x = d1 - (sq(d1) - sq(d2) + t) / sqrt(t) / 2;
27    double y = d2 - (sq(d2) - sq(d1) + t) / sqrt(t) / 2;
28    cout << (x * x * (3 * d1 - x) + y * y * (3 * d2 - y)) * r;
29    }
30    cout << endl;
31    return 0;
32 }

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

判断题
  1. 将第 21 行中 t 的类型声明从 int 改为 double, 不会 影响程序运行的结果。()

    A. 正确 B. 错误

  2. 将第 26、27 行中的 / sqrt(t) / 2替换为/ 2 / sqrt(t),不会影响程序运行的结果。( )

    A. 正确 B. 错误

  3. 将第 28 行中的 x * x 改成 sq(x)y * y 改成 sq(y),不会影响程序运行的结果。( )

    A. 正确 B. 错误

  4. (2 分) 当输入为 0 0 0 1 1 0 0 1 时,输出为 1.3090 ( )

    A. 正确 B. 错误

单选题
  1. 当输入为 1 1 1 1 1 1 1 2 时,输出为( )。
    A. 3.1416
    B. 6.2832
    C. 4.7124
    D. 4.1888
  2. (2.5 分)这段代码的含义为( )。
    A. 求圆的面积并
    B. 求球的体积并
    C. 求球的体积交
    D. 求椭球的体积并

代码分析
  • 常量 r = acos(0.5) = π/3,配合后续乘以4或乘以 (x²(3d₁-x)+y²(3d₂-y)) 用于计算球体积或球缺体积。

  • sq, cu 分别计算平方、立方(参数为整数)。

  • 输入四个整数表示第一个球的球心坐标 (a₁,b₁,c₁) 和半径 d₁,后四个为第二个球。

  • t 为两球心距离平方。

  • 分支逻辑

    • t ≤ (d₂-d₁)²:内含或内切,交体积 = 小球的体积,即 (4/3)π·min(d₁,d₂)³,对应 cu(min(d₁,d₂)) * r * 4

    • t ≥ (d₂+d₁)²:相离或外切,交体积 = 0。

    • 否则:相交,计算两球冠高度:

      cpp 复制代码
      double x = d1 - (d1*d1 - d2*d2 + t) / sqrt(t) / 2;   // 球冠高度 h₁
      double y = d2 - (d2*d2 - d1*d1 + t) / sqrt(t) / 2;   // 球冠高度 h₂

      交体积 = 两球缺体积之和 = (π/3)·[h₁²(3d₁-h₁) + h₂²(3d₂-h₂)],对应输出 (x*x*(3*d1-x)+y*y*(3*d2-y)) * r

  • 结论 :程序计算两个球的交集体积


判断题答案及解析
  1. t 的值来自整数的平方和,在 int 范围内(输入绝对值 ≤ 10001000,平方和 ≤ 3×(20002000)² ≈ 1.2×10¹⁴,仍可由 double 精确表示)。后续 sqrt(t) 等操作均使用浮点数,转换不会损失精度,程序行为不变。正确

  2. 26、27行中的小括号部分运算结果是整数,先除以sqrt部分为纯浮点除法,如果改为先除以2,包含整数除法截断,结果不同。错误

  3. sq 函数参数为 const int,传入 doublex 会隐式转换为 int,导致小数部分被截断,平方结果错误,从而改变交体积计算值。错误

  4. 两球半径均为 1,球心距 = 1。相交部分体积公式:V = π(4R+d)(2R-d)²/12,代入得 5π/12 ≈ 1.308996,保留四位小数为 1.3090。程序输出一致。正确


单选题解析
  1. 球心重合,半径 1 的球完全包含在半径 2 的球内,交体积 = 小球体积 = (4/3)π·1³ ≈ 4.18879,输出 4.1888,选 D

  2. 根据上述分析,程序根据球心距与半径关系分三种情况计算两球重叠部分的体积,即球的体积交 ,选 C


专栏推荐:信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html


各种学习资料,助力大家一站式学习和提升!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"##########  一站式掌握信奥赛知识!  ##########";
	cout<<"#############  冲刺信奥赛拿奖!  #############";
	cout<<"######  课程购买后永久学习,不受限制!   ######";
	return 0;
}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
REDcker2 小时前
curl完整文档
c++·c·curl·服务端·后端开发
小比特_蓝光2 小时前
STL小知识点——C++
java·开发语言·c++·python
阿猿收手吧!2 小时前
【C++】格式化库:告别繁琐,拥抱高效
开发语言·c++
俩娃妈教编程2 小时前
洛谷选题:P1055 [NOIP 2008 普及组] ISBN 号码
c++·算法
悲伤小伞2 小时前
Linux_应用层自定义协议与序列化——网络计算器
linux·服务器·c语言·c++·ubuntu
llz_1122 小时前
蓝桥杯备赛-搜索(DFS/BFS)
c++·算法·蓝桥杯·深度优先·宽度优先
郁闷的网纹蟒3 小时前
虚幻5---第15部分---宝藏(掉落物)
开发语言·c++·ue5·游戏引擎·虚幻
俩娃妈教编程3 小时前
洛谷选题:P1888 三角函数
c++·算法