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;
}
相关推荐
福楠15 分钟前
现代C++ | 右值引用 + std::move + noexcept
linux·c语言·开发语言·c++
格林威24 分钟前
工业相机图像采集处理:从 RAW 数据到 AI 可读图像,附海康相机 C++实战代码
开发语言·c++·人工智能·数码相机·计算机视觉·c#·工业相机
闻道且行之1 小时前
libhv 安装与使用全流程教程
c++·http·socket·libhv·c/c++
旺仔.2911 小时前
顺序容器:forward list单链表 详解
数据结构·c++·list
txinyu的博客1 小时前
解析muduo源码之 HttpServer.h & HttpServer.cc
c++
郝学胜-神的一滴1 小时前
从线程栈到表达式求值:栈结构的核心应用与递归实现
开发语言·数据结构·c++·算法·面试·职场和发展·软件工程
charlie1145141911 小时前
通用GUI编程技术——Win32 原生编程实战(十八)——GDI 设备上下文(HDC)完全指南
开发语言·c++·ide·学习·visual studio·win32
tankeven1 小时前
HJ150 全排列
c++·算法
Q741_1471 小时前
每日一题 力扣 2946. 循环移位后的矩阵相似检查 力扣 155. 最小栈 数学 数组 模拟 C++ 题解
c++·算法·leetcode·矩阵·模拟·数组·
2301_810160951 小时前
C++中的状态模式
开发语言·c++·算法