GESP:2023年12月 C++八级 真题及解析

四季读书网 6 0
GESP:2023年12月 C++八级 真题及解析
老师已为大家备好电子打印版,需要完整电子版文件的朋友,可以拉到文末查看
GESP:2023年12月 C++八级 真题及解析-第1张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第2张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第3张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第4张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第5张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第6张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第7张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第8张图片-四季读书网

【答案解析】

1.解释:答案选C。
本题可抽象为分类计数问题,应使用加法原理,而不是乘法原理。答案为ACB的方案数2加上ADB的方案数3,共有2+3=5种方案,选项C正确
2.解释:答案选A。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第9张图片-四季读书网
3.解释:答案选D。
对象的声明周期开始和结束时会分别执行构造函数和析构函数,选项A、B正确。对于选项C、D,虚函数是指被 virtual 关键字修饰的成员函数;定义虚函数是为了允许用基类的指针来调用派生类的该函数。允许将析构函数定义为虚函数,是因为有使用“ delete 基类指针”来销毁对象的需求,选项C正确。但对象构造时必须指定准确的类,不能使用基类名构造派生类的对象,没有将构造函数定义为虚函数的需要,选项D错误
4.解释:答案选B。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第10张图片-四季读书网
5.解释:答案选C。
详细解析见下图——
方法一:直接计算符合条件的排列数
● 安排受限的同学
这位同学不能排在第一位,所以有4个位置可选(第2、3、4、5位),有4种选择
● 安排剩下的4位同学
剩下4个位置,4位同学任意排列
排列数为4! = 4×3×2×1 = 24
● 符合条件的排列数:4×24 = 96
方法二:间接计算(总排列数 - 不符合条件的排列数)
● 总排列数
5位同学任意排列,排列数为5! = 5×4×3×2×1 = 120
● 不符合条件的排列数
受限同学排在第一位的情况,剩下4位同学任意排列
排列数为4! = 24
● 符合条件的排列数:120 - 24 = 96
选项C正确
6.解释:答案选D。

详细解析如下——

GESP:2023年12月 C++八级 真题及解析-第11张图片-四季读书网
7.解释:答案选A。
详细解析见下图——
GESP:2023年12月 C++八级 真题及解析-第12张图片-四季读书网

相关知识点的复习与拓展:

截至考试当年12月,有关三角形的面积公式,简单罗列如下——

GESP:2023年12月 C++八级 真题及解析-第13张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第14张图片-四季读书网
8.解释:答案选C。
树的遍历过程需要对每个元素访问一次,因此时间复杂度为O(n)选项C正确

相关知识点的复习与拓展:

截至考试当年12月,有关二叉树深度优先搜索的三种遍历方式,可以参考下图帮助理解———

GESP:2023年12月 C++八级 真题及解析-第15张图片-四季读书网
9.解释:答案选A。
详细解析见下图——
GESP:2023年12月 C++八级 真题及解析-第16张图片-四季读书网
10.解释:答案选C。
详细解析见下图——
GESP:2023年12月 C++八级 真题及解析-第17张图片-四季读书网
11.解释:答案选D。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第18张图片-四季读书网
12.解释:答案选B。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第19张图片-四季读书网
13.解释:答案选B。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第20张图片-四季读书网
14.解释:答案选A。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第21张图片-四季读书网
15.解释:答案选C。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第22张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第23张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第24张图片-四季读书网

【答案解析】

1.解释:错误。

在 C++ 中,x * 2 - 4 = 0; 是一个赋值语句,但它的左侧 x * 2 - 4 是一个表达式,而不是一个可赋值的变量(左值)。

赋值运算符 = 要求左侧必须是一个可修改的左值(如变量、数组元素等),而 x * 2 - 4 是一个计算结果,不能作为赋值目标。

C++ 不会自动求解方程,它只会执行指令。如果想将变量 x 赋值为 2.0,应该写成:x = 2.0; 或者 x = (4 + 0) / 2;  (但这也是直接计算,不是求解方程)。

原语句 x * 2 - 4 = 0; 本身是有语法错误,无法通过编译。

2.解释:正确。

这个说法是正确的,我们可以通过分类枚举所有合法的颜色序列来验证:

已知袋子里共有3个相同红球(记为R)、2个相同蓝球(记为B),不放回取3次,因此取出的序列中红球个数最多为3个,蓝球个数最多为2个,按蓝球出现的数量分类:

‌取出0个蓝球、3个红球‌:仅存在1种颜色顺序:RRR,符合红球总数要求。

‌取出1个蓝球、2个红球‌:蓝球可以出现在第1、2、3位,共3种颜色顺序:BRR、RBR、RRB,均满足蓝球、红球的总数限制。

‌取出2个蓝球、1个红球‌:红球可以出现在第1、2、3位,共3种颜色顺序:RBB、BRB、BBR,均满足蓝球总数为2个的限制。

将三类情况相加,总共有1+3+3=7种不同的颜色顺序。

3.解释:正确。

杨辉三角,是二项式系数在三角形中的一种几何排列,在中国南宋数学家杨辉所著的《详解九章算法》中出现。

4.解释:错误。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第25张图片-四季读书网

5.解释:正确。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第26张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第27张图片-四季读书网

6.解释:正确。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第28张图片-四季读书网

7.解释:错误。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第29张图片-四季读书网

8.解释:错误

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第30张图片-四季读书网

9.解释:错误。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第31张图片-四季读书网

10.解释:正确。

详细解析见下图——

GESP:2023年12月 C++八级 真题及解析-第32张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第33张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第34张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第35张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第36张图片-四季读书网

GESP 2023年12月 C++八级 奖品分配

#include <iostream>#include <vector>using namespace std;const int MOD = 1e9 + 7;    // 题目要求的取模值 10^9+7const int MAXN = 1005;      // 预处理阶乘的最大范围,覆盖题目数据上限long long fact[MAXN];       // fact[i] 存储 i! 模 MOD 的结果long long inv_fact[MAXN];   // inv_fact[i] 存储 i! 的模逆元/** * @brief 快速幂,计算 (base^exp) % MOD *        利用费马小定理求逆元:a^(MOD-2) ≡ a^{-1} (mod MOD),MOD是质数 */ longlongqpow(longlongbaselonglong exp) {    long long res = 1;    while (exp) {        if (exp & 1) {         // 如果当前二进制位为1,把base乘入结果            res = res * base % MOD;        }        base = base * base % MOD; // base平方        exp >>= 1;                // 指数右移一位    }    return res;}/** * @brief 预处理阶乘数组 fact 和阶乘逆元数组 inv_fact */voidpre() {    fact[0] = 1;  // 0! = 1    for (int i = 1; i < MAXN; i++) {        fact[i] = fact[i-1] * i % MOD;    }    // 先算出最大阶乘的逆元    inv_fact[MAXN-1] = qpow(fact[MAXN-1], MOD - 2);    // 倒推所有阶乘逆元:inv_fact[i] = inv_fact[i+1] * (i+1) % MOD    for (int i = MAXN - 2; i >= 0; i--) {        inv_fact[i] = inv_fact[i+1] * (i+1) % MOD;    }}intmain() {    pre();  // 程序开头预处理阶乘与逆元,只执行一次    int T;    cin >> T;    while (T--) {  // 依次处理T个班级的询问        int N, M;        cin >> N >> M;        vector<inta(M);        long long sum_a = 0;  // 所有奖品总数 S = sum(a_i)        for (int i = 0; i < M; i++) {            cin >> a[i];            sum_a += a[i];        }        // 计算 1/(a0! * a1! * ... * a(M-1)!) mod MOD,等价于各阶乘逆元相乘        long long inv_P = 1;        for (int num : a) {            inv_P = inv_P * inv_fact[num] % MOD;        }        long long ans;        if (sum_a == N) {            // 总奖品刚好等于人数:方案数 = N! / (a0!a1!...aM-1!)            ans = fact[N] * inv_P % MOD;        } else {            // sum_a == N+1,奖品多1个,需要舍弃1个            // 公式:ans = N! * (N+1) / (a0!a1!...aM-1!)            ans = fact[N] * (N + 1) % MOD;            ans = ans * inv_P % MOD;        }        cout << ans << endl;    }    return 0;}
代码思路——
GESP:2023年12月 C++八级 真题及解析-第37张图片-四季读书网

GESP:2023年12月 C++八级 真题及解析-第38张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第39张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第40张图片-四季读书网

GESP 2023年12月 C++八级 大量的工作沟通

#include<bits/stdc++.h>using namespace std;const int MAXN = 200005;  // 最大员工数量const int LOG = 20;       // 2^20 = 1,048,576,足够覆盖大多数情况vector<int> adj[MAXN];    // 邻接表存储树结构int depth[MAXN];          // 每个节点的深度(根节点深度为0)int up[MAXN][LOG];        // 倍增表,up[u][i]表示u的第2^i级祖先int bestNode[MAXN];       // 从根节点到当前节点路径上编号最大的节点/** * DFS预处理: * 1. 计算每个节点的深度 * 2. 填充倍增表up * 3. 计算bestNode:从根到该节点路径上的最大编号 *  * @param u 当前节点 * @param p 当前节点的父节点 */voiddfs(int u, int p){    // 设置当前节点的直接父节点(第0级祖先)    up[u][0] = p;    // 填充倍增表:u的第2^i级祖先 = u的第2^(i-1)级祖先的第2^(i-1)级祖先    for (int i = 1; i < LOG; i++) {        up[u][i] = up[up[u][i-1]][i-1];    }    // 计算从根到u路径上的最大编号节点    // 比较当前节点u的编号和父节点路径上的最大编号    bestNode[u] = max(u, bestNode[p]);    // 递归遍历所有子节点    for (int v : adj[u]) {        if (v == p) continue;  // 跳过父节点,防止循环        depth[v] = depth[u] + 1;        dfs(v, u);    }}/** * 计算两个节点的最近公共祖先(LCA) * 使用倍增法实现 *  * @param u 第一个节点 * @param v 第二个节点 * @return 两个节点的最近公共祖先节点编号 */intlca(int u, int v){    // 保证u的深度 >= v的深度    if (depth[u] < depth[v]) swap(u, v);    // 将u上移到与v同一深度    int diff = depth[u] - depth[v];    for (int i = 0; i < LOG; i++) {        if (diff & (1 << i)) {            u = up[u][i];        }    }    // 如果此时u == v,说明v就是LCA    if (u == v) return u;    // 从最高位开始,同时上移u和v    // 找到最后一个不同的祖先,再上移一步就是LCA    for (int i = LOG - 1; i >= 0; i--) {        if (up[u][i] != up[v][i]) {            u = up[u][i];            v = up[v][i];        }    }    // 返回父节点,即LCA    return up[u][0];}intmain(){    ios::sync_with_stdio(false);  // 关闭C和C++的输入输出同步,提高效率    cin.tie(0);                   // 解绑cin和cout的绑定,进一步提高效率    int N;    cin >> N;  // 读取员工数量    // 读入每个员工的直接领导    // 注意:i从1到N-1,因为0号是老板    for (int i = 1; i <= N - 1; i++) {        int f;        cin >> f;        // f是i的直接领导        adj[f].push_back(i);  // 添加从领导到下属的边        adj[i].push_back(f);  // 添加反向边,便于DFS遍历树    }    // 初始化根节点(0号员工)    depth[0] = 0;         // 根节点深度为0    bestNode[0] = 0;      // 根节点到自己的路径上最大编号就是0本身    // 从根节点开始DFS预处理    dfs(00);  // 根节点的父节点设为自身    int Q;    cin >> Q;  // 读取合作场次数量    // 处理每一场合作    while (Q--) {        int m;        cin >> m;  // 参与本次合作的员工数量        vector<intnodes(m);  // 存储参与合作的员工编号        bool hasZero = false;  // 标记是否包含0号员工        // 读取所有参与员工        for (int i = 0; i < m; i++) {            cin >> nodes[i];            if (nodes[i] == 0) hasZero = true;        }        /**         * 特殊情况:如果参与者中包含0号员工         * 根据题目规定,0号员工只能自我管理,不能被其他员工管理         * 因此只有0号员工能主持包含0号的合作         */        if (hasZero) {            cout << 0 << "\n";            continue;        }        /**         * 计算所有参与员工的最近公共祖先(LCA)         * 方法:先取第一个节点作为当前的LCA,然后依次与后续节点求LCA         * 最终得到所有节点的LCA         */        int l = nodes[0];  // 初始化LCA为第一个节点        for (int i = 1; i < m; i++) {            l = lca(l, nodes[i]);  // 逐个合并LCA        }        /**         * 答案的确定:         * 对于一组节点,所有能管理这些节点的员工就是这些节点的公共祖先         * 我们需要在这些公共祖先中找编号最大的         * 由于LCA是深度最大的公共祖先,其他公共祖先都在根到LCA的路径上         * 所以从根到LCA路径上的最大编号节点就是答案         * bestNode[l]已经预计算了从根到l路径上的最大编号节点         */        cout << bestNode[l] << "\n";    }    return 0;}
代码思路——
GESP:2023年12月 C++八级 真题及解析-第41张图片-四季读书网
GESP:2023年12月 C++八级 真题及解析-第42张图片-四季读书网

课程体系——

GESP:2023年12月 C++八级 真题及解析-第43张图片-四季读书网
需要无水印PDF格式文件,
或者课程体系咨询,
欢迎扫描下面二维码添加好友垂询。
GESP:2023年12月 C++八级 真题及解析-第44张图片-四季读书网

GESP:2023年12月 C++八级 真题及解析-第45张图片-四季读书网

▍ 声明:本文整理自网络,如有侵权,请联系删除。

本公号刊载此文,是出于合法合理地分享和传播信息,扩大大受众范围,促进学术交流,推动共同进步之目的。公众号持有人郑重声明,本文的发布,将严格遵守相关规定和法律法规,不侵犯任意潜在作者的权益,不改变引用原文(若有)的意图和内容。若有来源标注错误或侵犯了您的合法权益,请随时与我们联系协商,联系(QQ):993225721,我们将及时更正、删除。文章若有幸得到转载,首先,公众号持有人感谢转载人为读者阅读提供了有价值的信息和知识,希望文章能够在被转载的平台上得到更广泛的传播和交流;其次,转载人应充分考虑到转载动作本身所可能带来的相应的风险和责任,包括但不限于侵犯知识产权、侵犯他人权益等行为所引起的法律责任,确保本文的合法传播和使用。同时,本人也极其愿意在转载过程中尽力配合转载人了解、关注、规避、消除相关的潜在风险。若转载人有相任何关疑虑,同样欢迎随时与我们联系协商,联系(QQ):993225721。

喜欢您关注我们哦——

抱歉,评论功能暂时关闭!