⼩杨要从 城到 城,⼜想顺路游览⼀番。他有两个选项:、坐⾼铁路到 城游览,再坐⾼铁或飞机到 城;、坐船到 城游览,再坐船、⾼铁或飞机到 城。请问⼩杨从 城到 城共有⼏种交通⽅案可以选择?( )
C:5。分类相加:走 C 城的方案 1 有 1×2=2 种(A 到 C 只有高铁 1 种,C 到 B 有高铁、飞机 2 种);走 D 城的方案 2 有 1×3=3 种(D 到 B 有船、高铁、飞机 3 种);两类互斥相加得 2+3=5。
以下哪个函数声明是符合语法的 ,且在调⽤时可以将⼆维数组的名字作为实际参数传递给形式参数 ? ( ) 。
A:二维数组作实参时形参只能省略第一维,必须写明列数 int a[][10],编译器才能按行推算元素地址;B、C 缺列数无法寻址,D 的 int** 与二维数组名(指向一维数组的指针)类型不匹配。
下⾯有关 C++ 类和对象的说法 ,错误的是( )
D:构造函数不能是虚函数。对象构造期间虚表指针尚未初始化完成,虚调用无从分发,C++ 直接禁止;析构函数则常设为虚函数以保证通过基类指针 delete 派生对象时正确析构,A、B、C 均正确。
使⽤邻接矩阵表达 个顶点的有向图 ,则该矩阵的大小为( )
B:n×n。邻接矩阵按行、列各对应一个顶点,共 n 行 n 列 n² 个元素;有向图同样如此,只是 a[i][j] 与 a[j][i] 表示两条方向相反的边,矩阵不再对称。
位同学排队,其中⼀位同学不能排在第⼀,则共有多少种可能的排队⽅式?
C:96。先确定第一位:该同学不能排第一,从其余 4 人中选,有 4 种;剩下 4 人任意排列 4!=24 种;由乘法原理共 4×24=96,也可用 5!-4!=120-24 排除该同学居首的情况。
⼀个⽆向图包含 个顶点 ,则其最⼩⽣成树包含多少条边?( )
D:最小生成树以图连通为前提,题面只说无向图未保证连通,若图不连通则最小生成树不存在;连通时边数才恒为 n-1,故 D 表述最严谨,A 只在连通时成立。
已知三个 double 类型的变量 和 分别表⽰⼀个三角形的两条边长及⼆者的夹角(弧度),则下列哪个表达式可以计算这个三角形的⾯积?( )。
A:两边夹一角求面积用 S=½ab·sinθ;B 错把 a+b 当边长,C 的 cos 应换成 sin,D 的根式是余弦定理求第三边 c=√(a²+b²-2ab·cosθ),均非面积公式。
对有 个元素的⼆叉排序树进⾏中序遍历,其时间复杂度是( )
C:O(n)。中序遍历按左-根-右访问每个结点恰好一次,n 个结点共 n 次访问,每步 O(1),总时间与结点数成正比,与树的形态、是否平衡无关。
假设输⼊参数 和 满⾜ ,则下⾯程序的最差情况的时间复杂度为( )
01int gcd(int m, int n){ 02 while (m > 0){ 03 int t = m; 04 m = n % m; 05 n = t; 06 } 07 return n; 08}
A:O(log n)。这是辗转相除法,每轮把 (m,n) 换成 (n%m,m),余数至多约为 m 的一半,规模指数下降;相邻斐波那契数构成最坏情形,迭代次数约 log_φ n 次。
下⾯程序的时间复杂度为( )。
01long long power_mod(long long a, long long n, long long mod){ 02 if (n == 0) 03 return 1; 04 a = a % mod; 05 if (n == 1) 06 return a; 07 long long pw = power_mod(a, n / 2, mod); 08 long long pw2 = pw * pw % mod; 09 if (n % 2 == 0) 10 return pw2; 11 return pw2 * a % mod; 12}
C:O(log n)。这是快速幂:每次递归把指数 n 折半,递归深度约 log₂n,每层只做常数次乘法与取模,总复杂度 O(log n),与底数 a 无关。
下⾯程序的时间复杂度为( )
01int record_choose[MAXN][MAXN]; 02int choose(int n, int m){ 03 if (m == 0 || m == n) 04 return 1; 05 if (record_choose[n][m] == 0) 06 return record_choose[n][m] = choose(n - 1, m - 1) + choose(n - 1, m); 07 return record_choose[n][m]; 08}
D:O(m×(n-m))。record_choose 记忆化保证每个状态 (n′,m′) 只算一次,可达状态满足 m′≤m、m′≤n′≤n,数量约 (n-m+1)(m+1),每状态 O(1) 转移,故总复杂度为 O(m(n-m))。
下⾯的程序使⽤出边的邻接表表达有向图,则下列选项中哪个是它表达的
图?( )。
01#include <iostream> 02 03struct Edge { 04 int e; 05 Edge * next; 06}; 07struct Node { 08 Edge * first; 09} 10 11int main() { 12 Edge e[5] = {{1, nullptr}, {2, &e[2]}, {3, nullptr}, {3, nullptr}, {0, nullptr}}; 13 Node n[4] = {&e[0], &e[1], &e[3], &e[4]}; 14 ; // 其他处理 15}
B:沿出边链逐条读:n[0] 链头 e[0] 指向顶点 1;n[1] 链 e[1]→e[2] 指向 2、3;n[2] 的 e[3] 指向 3;n[3] 的 e[4] 指向 0。得边集 0→1、1→2、1→3、2→3、3→0,与 B 图一致。
下⾯程序的输出为( )
01#include <iostream> 02using namespace std; 03 04int main(){ 05 int cnt = 0; 06 for (int a = 1; a <= 10; a++) 07 for (int b = 1; b <= 10; b++) 08 for (int h = 1; h <= 10; h++) 09 if ((a + b) * h == 20) 10 cnt++; 11 cout << cnt << endl; 12 return 0; 13}
B:18。由 (a+b)×h=20 且 h≤10,h 只能取 20 的因子 1、2、4、5、10;对应 a+b=20、10、5、4、2,再受 a,b≤10 约束,有序对依次为 1、9、4、3、1 组,合计 18。
下⾯程序的输出为( )
01#include <iostream> 02using namespace std; 03 04int main() { 05 const int N = 30; 06 int cnt = 0; 07 for (int a = 1; a <= N; a++) 08 for (int b = a; a + b <= N; b++) 09 for (int c = b; a + b + c <= N; c++) 10 if (a * a + b * b == c * c) 11 cnt++; 12 cout << cnt << endl; 13 return 0; 14}
A:3。在 a≤b≤c 且 a+b+c≤30 下枚举勾股三元组:3-4-5、6-8-10、5-12-13(和恰为 30)共 3 组;8-15-17、7-24-25、9-12-15 等和均超过 30 被剪枝排除。
下⾯的程序中 ,⼆维数组 和 分别代表如下图所⽰的⽹格中的⽔平边的时间消耗和垂直边的时间消耗。 程序使⽤动态规划计算从左下角到右上角的最⼩时间消耗 ,则横线处应该填写下列哪个选项的代码?( )。
C:到达 (i+1,j+1) 只有两条来路:从左侧 (i,j+1) 向上跨垂直边 v[i][j+1],或从下方 (i+1,j) 向右跨水平边 h[i+1][j],取两路最小消耗;D 把 h、v 用反,A、B 的坐标索引与图中边定义不符。
C++ 语⾔⾮常强⼤ ,可以⽤来求解⽅程的解 。例如 ,如果变量 为 double 类型的变量,则执⾏语句 x * 2 - 4 = 0; 后,变量 的值会
B:错误。x*2-4=0 中赋值号左侧是表达式而非变量,C++ 要求左值可寻址才能赋值,该语句编译不过,x 的值根本不会被改变,更谈不上解出方程根。
⼀个袋⼦中有 个完全相同的红⾊⼩球、 个完全相同的蓝⾊⼩球 。每次从中取出 个 ,且不放回袋⼦ ,这样 进⾏ 次后 ,将取出的⼩球依次排列 ,则可能的颜⾊顺序有 种
A:正确。取 3 次得到长度 3 的颜色序列,受红 3 蓝 2 限制:全红 RRR 1 种,两红一蓝 RRB、RBR、BRR 3 种,一红两蓝 RBB、BRB、BBR 3 种,共 1+3+3=7 种。
杨辉三角 ,是⼆项式系数的⼀种三角形排列 ,在中国南宋数学家杨辉 年所著的《详解九章算法》⼀书中 出现 ,是中国数学史上的⼀项伟⼤成就
A:正确。杨辉三角就是二项式系数的三角形排列,杨辉于 1261 年在《详解九章算法》中著录,并注明引自贾宪,属真实数学史实。
个顶点的有向完全图(不带⾃环)有 条
B:错误。有向完全图中每对顶点之间有两条方向相反的弧,总边数为 N(N-1);N(N-1)/2 是每对顶点只连一条边的无向完全图的边数,少算了一半。
如果待查找的元素确定 ,只要哈希表的⼤⼩不⼩于查找元素的个数 ,就⼀定存在不会产⽣冲突的哈希函数。
A:正确。只要表容量不小于元素个数,就能构造一一映射的哈希函数(如把元素按顺序对应到互不相同的槽位),因此必存在零冲突的散列方案,无需担心碰撞。
动态规划算法的时间复杂度⼀般为:必要状态的数量 ,乘以计算⼀次状态转移⽅程的时间复杂度。
A:正确。DP 总耗时=状态数×单次状态转移的代价,这是估算动态规划复杂度的通用公式,如 n² 个状态、每个 O(1) 转移则整体 O(n²)。
已知 int 类型的变量 和 中分别存储着⼀个梯形的顶边长、底边长和⾼ ,则这个梯形的⾯积可以通 过表达式 求得
B:错误。a、b、h 都是 int,(a+b)×h 先算再整体整除 2,小数部分被截断;如 a=1、b=2、h=3 时真面积 4.5,表达式却得 (3×3)/2=4,不能精确表示梯形面积。
判断图是否连通只能⽤⼴度优先搜索算法实现
B:错误。判断连通性不只 BFS 一种:DFS 从一个顶点出发看能否到达全部顶点即可;也可用并查集合并所有边后统计连通分量个数是否为 1。
在 个元素的⼆叉排序树中查找⼀个元素 ,最好情况的时间复杂度是 。
B:错误。最好情况是目标恰为树根,一次比较即命中,复杂度 O(1);O(log N) 只是平衡树的平均/最坏上界,若树退化成链,最坏查找可达 O(N)。
给定 double 类型的变量 ,且其值⼤于等于 ,我们可以通过⼆分法求出的 近似值
A:正确。√x 在 [0, x](x<1 时上界取 1)上单调,二分比较 mid² 与 x 的大小即可不断收窄区间,迭代 k 次误差降至 2⁻ᵏ,能逼近任意精度。