老师已为大家备好电子打印版,需要完整电子版文件的朋友,可以拉到文末查看。 【答案解析】
1.解释:答案选C。 本题可抽象为分类计数问题,应使用加法原理,而不是乘法原理。答案为ACB的方案数2加上ADB的方案数3,共有2+3=5种方案,选项C正确。 2.解释:答案选A。 详细解析见下图——
3.解释:答案选D。 对象的声明周期开始和结束时会分别执行构造函数和析构函数,选项A、B正确。对于选项C、D,虚函数是指被 virtual 关键字修饰的成员函数;定义虚函数是为了允许用基类的指针来调用派生类的该函数。允许将析构函数定义为虚函数,是因为有使用“ delete 基类指针”来销毁对象的需求,选项C正确。但对象构造时必须指定准确的类,不能使用基类名构造派生类的对象,没有将构造函数定义为虚函数的需要,选项D错误。 4.解释:答案选B。 详细解析见下图——
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。 详细解析如下——
7.解释:答案选A。 详细解析见下图——相关知识点的复习与拓展:
截至考试当年12月,有关三角形的面积公式,简单罗列如下——
8.解释:答案选C。 树的遍历过程需要对每个元素访问一次,因此时间复杂度为O(n),选项C正确。 相关知识点的复习与拓展:
截至考试当年12月,有关二叉树深度优先搜索的三种遍历方式,可以参考下图帮助理解———
9.解释:答案选A。 详细解析见下图——10.解释:答案选C。 详细解析见下图—— 11.解释:答案选D。 详细解析见下图——
12.解释:答案选B。 详细解析见下图——
13.解释:答案选B。 详细解析见下图——
14.解释:答案选A。 详细解析见下图——
15.解释:答案选C。 详细解析见下图——
【答案解析】
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.解释:错误。
详细解析见下图——
5.解释:正确。
详细解析见下图——
6.解释:正确。
详细解析见下图——
7.解释:错误。
详细解析见下图——
8.解释:错误。
详细解析见下图——
9.解释:错误。
详细解析见下图——
10.解释:正确。
详细解析见下图——
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(longlongbase, longlong 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! = 1for (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) % MODfor (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<int> a(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++八级 大量的工作沟通
#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就是LCAif (u == v) return u;// 从最高位开始,同时上移u和v// 找到最后一个不同的祖先,再上移一步就是LCAfor (int i = LOG - 1; i >= 0; i--) {if (up[u][i] != up[v][i]) {u = up[u][i];v = up[v][i];}}// 返回父节点,即LCAreturn 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; // 根节点深度为0bestNode[0] = 0; // 根节点到自己的路径上最大编号就是0本身// 从根节点开始DFS预处理dfs(0, 0); // 根节点的父节点设为自身int Q;cin >> Q; // 读取合作场次数量// 处理每一场合作while (Q--) {int m;cin >> m; // 参与本次合作的员工数量vector<int> nodes(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;}代码思路——课程体系——
需要无水印PDF格式文件, 或者课程体系咨询, 欢迎扫描下面二维码添加好友垂询。
▍ 声明:本文整理自网络,如有侵权,请联系删除。
本公号刊载此文,是出于合法合理地分享和传播信息,扩大大受众范围,促进学术交流,推动共同进步之目的。公众号持有人郑重声明,本文的发布,将严格遵守相关规定和法律法规,不侵犯任意潜在作者的权益,不改变引用原文(若有)的意图和内容。若有来源标注错误或侵犯了您的合法权益,请随时与我们联系协商,联系(QQ):993225721,我们将及时更正、删除。文章若有幸得到转载,首先,公众号持有人感谢转载人为读者阅读提供了有价值的信息和知识,希望文章能够在被转载的平台上得到更广泛的传播和交流;其次,转载人应充分考虑到转载动作本身所可能带来的相应的风险和责任,包括但不限于侵犯知识产权、侵犯他人权益等行为所引起的法律责任,确保本文的合法传播和使用。同时,本人也极其愿意在转载过程中尽力配合转载人了解、关注、规避、消除相关的潜在风险。若转载人有相任何关疑虑,同样欢迎随时与我们联系协商,联系(QQ):993225721。 喜欢您关注我们哦——












































