为丰富⾷堂菜谱,炒菜部进⾏头脑风暴。⾁类有鸡⾁、⽜⾁、⽺⾁、猪⾁种,切法有⾁排、⾁块、⾁末种,配菜有圆⽩菜、油菜、⾖腐种,辣度有⿇辣、微辣、不辣种。不考虑⼝感的情况下,选种⾁、种切法、种配菜、种辣度产⽣⼀道菜(例如:⿇辣⽜⾁⽚炒⾖腐),这样能产⽣多少道菜?( )。
D:108。四步选择相互独立,用乘法原理:肉 4 种×切法 3 种×配菜 3 种×辣度 3 种=4×3×3×3=108 道菜。
已知袋中有个相同的红球、个相同的绿球、个相同的黄球。每次取出⼀个不放回,全部取出。可能产⽣多少种序列?( )。
C:2520。10 个球的全排列 10!,再除以同色球互换造成的重复:红 2!、绿 3!、黄 5!,得 10!/(2!·3!·5!)=3628800/1440=2520。
以下⼆维数组的初始化,哪个是符合语法的?( )。
B:int a[][2]={} 合法:第二维必须显式给出、第一维可由初始化列表推导;A、D 省略第二维无法确定每行元素数,C 每行给了 3 个初值超出列数 2,均编译不过。
下⾯有关C++拷贝构造函数的说法,错误的是( )。
A:编译器会自动生成默认拷贝构造函数做逐成员拷贝,不自己实现也能编译;B、C、D 三种情形(值传参、值返回、用对象初始化对象)确实会自动调用拷贝构造函数。
使⽤邻接表表达⼀个⽆向简单图,图中包含 v 个顶点、e 条边,则该表中边节点的个数为( )。
C:2×e。无向图中每条边会在两个端点的邻接链表中各存一个边节点,所以边节点总数是 2e;有向图的边只存一次,才是 e 个节点。
关于⽣成树的说法,错误的是( )。
D:生成树是树的特例,须以图连通为前提;D 无条件断言『n 个顶点的无向图生成树含 n-1 条边』,未考虑图不连通时根本不存在生成树。A、B 正确,C 是 Cayley 公式 n^(n-2)。
已知三个double 类型的变量a、b和theta 分别表⽰⼀个三角形的两条边长及⼆者的夹角(弧度),则下列哪个表达式可以计算这个三角形的周长?( )。
D:周长=三边之和。已知 a、b 及夹角 θ,第三边由余弦定理 c=√(a²+b²-2ab·cosθ) 求出,a+b+c 即 D;A 是面积公式,B、C 属错误拼接。
在有 个元素的⼆叉排序树中进⾏查找,其最好、最差时间复杂度分别为( )。
A:BST 查找最好 O(1)——目标恰为根时一次命中;最差 O(n)——树退化为单链时每步只排除一个结点。O(log n) 只是平衡或平均情形,故 B、C、D 均错。
如下图所⽰,半径为r、圆⼼角为t(弧度)的扇形,下⾯哪个表达式能够求出顶部阴影部分的⾯积?( )。
D:阴影=扇形面积−等腰三角形面积。扇形为 r²t/2,两条半径夹的三角形为 r²·sin t/2,相减得 r²(t−sin t)/2;C 少了分母 2。
下⾯程序的时间复杂度为( )。
01int fib(int n) { 02 if (n <= 1) 03 return 1; 04 return fib(n - 1) + fib(n - 2); 05}
B:T(n)=T(n-1)+T(n-2) 是斐波那契型递推,通解为 O(φⁿ),φ=(1+√5)/2≈1.618;O(2ⁿ) 虽是合法上界但不够紧,φⁿ 才是精确阶。
下⾯程序的时间复杂度为( )。
01int choose(int n, int m) { 02 if (m == 0 || m == n) 03 return 1; 04 return choose(n - 1, m - 1) + choose(n - 1, m); 05}
C:无记忆化的组合数递归每次分裂成两支,递归树叶子数恰为 C(n,m)(叶子对应 m=0 或 m=n 的终止分支),总调用量即 O(C(n,m))。
下⾯程序的时间复杂度为( )。
01int primes[MAXP], num = 0; 02bool isPrime[MAXN] = {false}; 03void sieve() { 04 for (int n = 2; n <= MAXN; n++) { 05 if (!isPrime[n]) 06 primes[num++] = n; 07 for (int i = 0; i < num && n * primes[i] <= MAXN; i++) { 08 isPrime[n * primes[i]] = true; 09 if (n % primes[i] == 0) 10 break; 11 } 12 } 13}
A:O(n)。这是欧拉线性筛:每个合数只被其最小质因子标记一次,内层循环遇 n%primes[i]==0 立即 break,保证不重复,总复杂度线性。
下⾯程序的输出为( )。
01#include <iostream> 02using namespace std; 03 04int a[10][10]; 05int main() { 06 int m = 5, n = 4; 07 for (int x = 0; x <= m; x++) 08 a[x][0] = 1; 09 for (int y = 1; y <= n; y++) 10 a[0][y] = 1; 11 for (int x = 1; x <= m; x++) 12 for (int y = 1; y <= n; y++) 13 a[x][y] = a[x - 1][y] + a[x][y - 1]; 14 cout << a[m][n] << endl; 15 return 0; 16}
C:126。递推 a[x][y]=a[x-1][y]+a[x][y-1] 即网格从 (0,0) 到 (x,y) 的路径数,边界为 1,故 a[5][4]=C(5+4,4)=C(9,4)=126。
下⾯程序的输出为( )。
01#include <iostream> 02using namespace std; 03 04int main() { 05 int cnt = 0; 06 for (int x = 0; x <= 10; x++) 07 for (int y = 0; y <= 10; y++) 08 for (int z = 0; z <= 10; z++) 09 if (x + y + z == 15) 10 cnt++; 11 cout << cnt << endl; 12 return 0; 13}
B:91。x+y+z=15 的非负整数解共 C(17,2)=136;扣除某变量≥11 的越界解:x≥11 时令 x′=x-11 得 C(6,2)=15,三个变量共 45,136-45=91。
下⾯的程序使⽤邻接矩阵表达的带权⽆向图,则从顶点0到顶点3的最短距离为( )。
01int weight[4][4] = { 02 { 0, 1, 7, 100}, 03 { 1, 0, 5, 15}, 04 { 7, 5, 0, 6}, 05 {100, 15, 6, 0}};
C:12。图中边权:0-1=1、1-2=5、2-3=6,走 0→1→2→3 总长 1+5+6=12;对比 0→2→3=13、0→3 直达=100,12 为最短。
已知 int 类型的变量 和 ,则执⾏语句 a, b = b, a; 后,变量 和 的值会互换。
B:错误。C++ 没有 Python 式的多重赋值,a, b = b, a 中逗号是逗号运算符,等价于依次求值 a、(b=b)、a,只把 b 赋给自己,a、b 的值不会互换。
⼀个袋⼦中有 个完全相同的红⾊⼩球、 个完全相同的蓝⾊⼩球。每次从中取出 个,再放回袋⼦,这样进⾏ 次后,可能的颜⾊顺序有 种。
B:错误。有放回抽取每次红、蓝都可能取到,3 次相互独立,颜色序列共 2³=8 种(含 BBB);7 种是不放回情形(红蓝受 3、2 限制)的答案。
孙⼦定理是求解⼀次同余⽅程组的⽅法,最早见于中国南北朝时期(公元5世纪)的数学著作《孙⼦算经》。⼜称中国余数定理,是中国数学史上的⼀项伟⼤成就。
A:正确。孙子定理即中国剩余定理,用于求解一次同余式组,最早见于南北朝时期《孙子算经》的『物不知数』问题,属真实数学史实。
个顶点的⽆向完全图有 条边。
B:错误。无向完全图每对顶点只连一条边,边数为 C(N,2)=N(N-1)/2;N(N-1) 是每对顶点连两条方向相反弧的有向完全图的边数。
为解决哈希函数冲突,在哈希表项内设置链表存储该项内的所有冲突元素,则该哈希表内查找元素的最差时间复杂度为 。
B:错误。链地址法最坏情形是所有元素散列进同一个槽,该链表含全部 n 个元素,查找须遍历整条链,最坏复杂度是 O(n) 而非 O(1)。
求⼀个包含 个顶点、 条边的带权连通⽆向图的最⼩⽣成树,Prim算法的时间复杂度为 。
B:错误。Prim 朴素实现是 O(v²),用二叉堆优化后为 O((v+e)log v),不存在 O(v×e) 这个复杂度;O(v×e) 一般指邻接矩阵上某些最短路算法的上界。
已知int类型的变量 、 和 中分别存储着⼀个三角形的三条边长,则这个三角形的⾯积可以通过表达式 sqrt((a + b + c) * (b + c - a) * (a + c - b) * (a + b - c)) / 4 求得。
A:正确。海伦公式 S=√(s(s-a)(s-b)(s-c)),s=(a+b+c)/2;代入展开,四个因子各含 1/2,提出后得 √((a+b+c)(b+c-a)(a+c-b)(a+b-c))/4,与该表达式一致。
可以使⽤深度优先搜索算法判断图的连通性。
A:正确。从任一顶点 DFS,若访问顶点数等于总顶点数则图连通;若存在未访问顶点,说明有顶点无法到达,图不连通,DFS 与 BFS 判断能力相同。
在 个元素的⼆叉排序树中查找⼀个元素,平均情况的时间复杂度是 。
A:正确。随机插入元素形成的 BST 高度期望为 O(log N),查找平均比较次数即 O(log N);与退化成链时最坏 O(N) 并不矛盾。
给定 double 类型的变量 ,且其值⼤于等于 ,我们可以通过⼆分法求出 的近似值。
A:正确。x≥1 时 log x 落在 [0, x] 内,在该区间二分找 y 使 a^y=x(比较 a^mid 与 x 的大小),即可逼近任意精度的对数值。