1 单选题(每题 2 分,共 30 分)
第1题一间的机房要安排6名同学进行上机考试,座位共2行3列。考虑到在座位上很容易看到同一行的左右两侧的 屏幕,安排中间一列的同学做A卷,左右两列的同学做B卷。请问共有多少种排座位的方案?( )。
A. 720 B. 90 C. 48 D. 15
解析:答案A。座位如下图所示:坐②⑤的学生做A卷,坐①④③⑥的学生做B卷,由于没有指定哪些学生必须做A卷、哪些学生必须做B卷,所以这是个全排列,只要排到②⑤座位的学生就做A卷,其他学生做B卷。
=6!=720。

也可以这么考虑:6名同学是不同的个体,即同学之间是可区分的。需要计算将6名不同的同学分配到6个座位上,满足题目试卷分配规则的所有可能的排列方式。为了计算满足条件的排列方式,可以按照以下步骤进行:A卷座位:座位②, 座位⑤(共2个);B卷座位:座位①, 座位③, 座位④, 座位⑥(共4个)。从6名同学中选出2名来做A卷,其余4名做B卷。选择A卷同学的方式有
= 15 种。分配A卷同学到A卷座位:选出的2名A卷同学可以分配到座位2和座位5,有 2! = 2 种排列方式(因为两个A卷同学是不同的,可以交换位置)。分配B卷同学到B卷座位:剩下的4名B卷同学需要分配到4个B卷座位有 4! = 24 种方式。总方案数 = 选择A卷同学的方式 × 分配A卷同学到座位的方式 × 分配B卷同学到座位的方式=
×2!×4! = 15 × 2 × 24 = 720 种。故选A。
第2题 又到了毕业季,学长学姐们都在开心地拍毕业照。现在有3位学长、3位学姐希望排成一排拍照,要求男生不相邻、女生不相邻。请问共有多少种拍照方案?( )。
A. 720 B. 72 C. 36 D. 2
解析:答案B。3位学长、3位学姐排成一排拍照,要求男生不相邻、女生不相邻,只有如下图所示两种排法:

即①“男-女-男-女-男-女”和②“女-男-女-男-女-男”。排法①:3位学长在3个“男”位置上的排列有3! = 6种;3位学姐在3个“女”位置上的排列有3! = 6种。因此,该排法的排列数为 3! × 3! = 6 × 6 = 36 种。排法②:3位学长在3个“男”位置上的排列有3! = 6种;3位学姐在3个“女”位置上的排列有3! = 6种。因此,该排法的排列数为 3! × 3! = 6 × 6 = 36 种。合计72种。故选B。
第3题 下列关于C++类和对象的说法,错误的是( )。
A. 通过语句 const int x = 5; 定义了一个对象x。
B. 通过语句 std::string t = "12345"; 定义了一个对象t。
C. 通过语句 void (*fp)() = NULL; 定义了一个对象fp。
D. 通过语句 class MyClass; 定义了一个类MyClass。
解析:答案D。A. const int x = 5; x 是一个常量对象(尽管是基本类型,但C++允许称其为对象),正确。B. std::string t = "12345"; t 是 std::string 类的实例,属于对象,正确。C. void (*fp)() = NULL; fp 是一个函数指针,在C++中,指针变量也被视为对象,正确。D. class MyClass; 该语句是前向声明(forward declaration),仅声明类名,未定义类体,因此未完成类的定义,错误。故选D。
第4题 关于生成树的说法,错误的是( )。
A. 一个无向连通图,一定有生成树。
B. 𝑛个顶点的无向图,其生成树要么不存在,要么一定包含𝑛-1条边。
C. 𝑛个顶点、𝑛-1条边的无向图,不可能有多颗生成树。
D. 𝑛个顶点、𝑛-1条边的无向图,它本身就是自己的生成树。
解析:答案D。A. 无向连通图必然存在生成树。因为生成树的定义要求包含所有顶点且无环,而连通图本身已满足顶点间路径连通性,通过删除环边即可得到生成树,正确。B. 生成树若存在,则必含n−1 条边。这是生成树的基本性质(连通无环的极小图)。C. n个顶点、n−1 条边的无向图若连通则必为树(唯一生成树),但若不连通则无生成树,因此“不可能有多颗生成树”,正确(最多一棵)。D. n个顶点、n−1 条边的无向图不一定是生成树。反例:当图不连通时(如一个三角形加一个孤立顶点,共4顶点3边),它不符合生成树的连通性要求,所以错误。故选D。
第5题 一对夫妻生男生女的概率相同。这对夫妻希望儿女双全。请问这对夫妻生下两个孩子时,实现儿女双全的概率是多少?( )。
A.
B.
C.
D. ![]()
解析:答案C。假设每次生育独立且生男生女概率均为50%,则两个孩子的性别组合共有4种等可能情况:男孩+男孩(概率25%),男孩+女孩(概率25%)、女孩+男孩(概率25%)、女孩+女孩(概率25%),题目条件是"儿女双全",即需至少一个男孩和一个女孩,符合条件的是“男+女“和“女+男”两种组合,总概率为25%+25%=50%,即
。故选C。
第6题 已定义变量 double a, b; 下列哪个表达式可以用来判断一元二次方程
是否有实根?( )。
A. 4 * b - a * a < 0 B. 4 * b <= a * a C. a * a - 4 * b D. b * 4 - a * a
解析:答案B。一元二次方程
的解为
,有实根的条件是b²-4ac≥0。对本题方程
,a=1,b=a,c=b,实根的条件a²-4b≥0,即a*a-4*b>=0,也就是a*a>=4*b或4*b<=a*a。故选B。
第7题 𝑛个结点的二叉树,执行广度优先搜索的平均时间复杂度是( )。
A. O(log n) B. O(n log n) C. O(n) D. O(2ⁿ)
解析:答案C。广度优先搜索(BFS)会逐层访问所有节点,每个节点仅被访问一次,因此时间复杂度与节点数𝑛成正比。无论是平衡二叉树、普通二叉树还是退化的链表结构,BFS都需要遍历所有𝑛个节点,时间复杂度恒为O(n)。A. O(log n)适用于平衡二叉搜索树的查找操作,不适用于BFS,错误。B. O(n log n)常见于排序算法,与BFS无关,错误。D. O(2ⁿ)仅适用于满二叉树的节点总数计算(如𝑛层满二叉树有2ⁿ−1个节点),与时间复杂度无关,错误。故选C。
第8题 以下关于动态规划的说法中,错误的是( )。
A. 动态规划方法通常能够列出递推公式。
B. 动态规划方法的时间复杂度通常为状态的个数。
C. 动态规划方法有递推和递归两种实现形式。
D. 对很多问题,递推实现和递归实现动态规划方法的时间复杂度相当。
解析:答案B。动态规划的时间复杂度不仅取决于状态个数,还与状态转移的计算复杂度相关。例如,状态转移涉及多层循环时,时间复杂度可能是状态数的多项式倍数,所以B.错误。A.动态规划的核心是通过递推公式描述子问题与原问题的关系,正确。C.动态规划可通过递归(记忆化搜索)或递推(迭代)实现,正确。D.对于多数问题,两种实现的时间复杂度相同,但递归可能因函数调用产生额外开销,正确。故选C。
第9题 下面的sum_digit函数试图求出从1到n(包含1和n)的数中,包含数字d的个数。该函数的时间复杂度为( )。
- #include <string>
- int count_digit(int n, char d) {
- int cnt = 0;
- std::string s = std::to_string(n);
- for (int i = 0; i < s.length(); i++)
- if (s[i] == d)
- cnt++;
- return cnt;
- }
- int sum_digit(int n, char d) {
- int sum = 0;
- for (int i = 1; i <= n; i++)
- sum += count_digit(i, d);
- return sum;
- }
A. O(n log n) B. O(n) C. O(log n) D. O(n²)
解析:答案A。先分析count_digit函数的时间复杂度:将整数n转换为字符串的时间复杂度为O(log₁₀(n)),因为数字的位数与log₁₀(n)成正比,因为logₘ(n)=logₙ(n)/logₙ(m),log₁₀(n)= log₂(n)/ log₂(10),因为log₂(10)为常数,O(log₁₀(n))与O(log₂(n))相当,也与O(log(n))相当。遍历字符串的每个字符进行比较(n的位数为log₁₀n),时间复杂度为O(log n),因此count_digit函数的总时间复杂度为O(log n)。sum_digit函数的时间复杂度:外层循环执行n次,每次调用count_digit函数,每次count_digit调用时间为O(log i),最坏情况下i=n时为O(log n),因此总时间复杂度为n × O(log n) = O(n log n),所以该函数的时间复杂度为O(n log n)。这种复杂度属于线性对数阶,介于线性阶O(n)和平方阶O(n²)之间。故选A。
第10题 下面程序的输出为( )。
- #include <iostream>
- const int N = 10;
- int ch[N][N][N];
- int main() {
- for (int x = 0; x < N; x++)
- for (int y = 0; y < N; y++)
2025年6月CCF-GESP C++八级真题解析

最低0.47元/天 解锁文章
12万+

被折叠的 条评论
为什么被折叠?



