一间的机房要安排名同学进行上机考试,座位共行3列。考虑到在座位上很容易看到同一行的左右两侧的屏幕,安排中间一列的同学做A卷,左右两列的同学做B卷。请问共有多少种排座位的方案?( )
A:720。6 个座位各不相同,6 名同学任意分配即 6!=720;A/B 卷只是每列的座位属性,不限制具体坐谁,无需分组计算。
又到了毕业季,学长学姐们都在开心地拍毕业照。现在有位学长、位学姐希望排成一排拍照,要求男生不相邻、女生不相邻。请问共有多少种拍照方案?( )
B:72。男女必须交替站位,模式为男-女-男-女-男-女或其反序共 2 种;男生内部排列 3!=6、女生内部 3!=6,共 2×6×6=72。
下列关于C++类和对象的说法,错误的是( )
D:class MyClass; 只是前置声明,没有给出类体,尚未定义类;A 的 const int 变量、B 的 string、C 的函数指针都确实是对象。
关于生成树的说法,错误的是( )
D:n 个顶点 n-1 条边的无向图不保证连通,不连通时根本没有生成树,谈不上『自身就是生成树』;连通时它恰是树,A、B、C 均正确。
一对夫妻生两个孩子,实现儿女双全的概率是多少?
B:1/2。两个孩子的性别组合为男男、男女、女男、女女四种等可能,儿女双全对应男女、女男两种,概率 2/4=1/2,与出生顺序无关。
已定义变量 double a, b;,下列哪个表达式可判断方程 是否有实根?
B:4×b ≤ a²。判别式 Δ=a²−4b≥0 时有实根,移项即 4b≤a²;A 方向相反,C、D 只是数值表达式不是判断式。
个结点的二叉树,广度优先搜索的平均时间复杂度是?
C:O(n)。BFS 用队列逐层访问二叉树,每个结点入队、出队各一次,常数时间处理,总时间与结点数 n 成正比,与树高无关。
关于动态规划的说法,错误的是?
B:DP 总复杂度=状态个数×单个状态的转移代价,只说状态个数漏掉了转移开销;A、C、D 关于递推公式、两种实现及二者复杂度相当的说法都正确。
下面的sum_digit函数试图求出从 到 n(包含 和 n)的数中,包含数字 d 的个数。该函数的时间复杂度为( )
01#include <string> 02int count_digit(int n, char d) { 03 int cnt = 0; 04 std::string s = std::to_string(n); 05 for (int i = 0; i < s.length(); i++) 06 if (s[i] == d) 07 cnt++; 08 return cnt; 09} 10int sum_digit(int n, char d) { 11 int sum = 0; 12 for (int i = 1; i <= n; i++) 13 sum += count_digit(i, d); 14 return sum; 15}
A:O(n log n)。外层 i 从 1 到 n 共 n 次,每次 count_digit 把 i 转字符串并逐位比较,耗时 O(log i),故总 O(n log n)。
下面程序的输出为()
01#include <iostream> 02const int N=10; 03int ch[N][N][N]; 04int main(){ 05 for(int x=0;x<N;x++) 06 for (int y=0;y<N;y++) 07 for (int z=0;z<N; z++) 08 if(x==0&&y==0&&z==0) 09 ch[x][y][z]=1; 10 else{ 11 if(x>0) 12 ch[x][y][z]+=ch[x-1][y][z]; 13 if(y>0) 14 ch[x][y][z]+=ch[x][y-1][z]; 15 if(z>0) 16 ch[x][y][z]+=ch[x][y][z-1]; 17 } 18 std::cout<<ch[1][2][3]<<std::endl; 19 return 0; 20}
A:60。ch[x][y][z] 是从原点走到 (x,y,z) 的三维网格路径数,(1+2+3)!/(1!·2!·3!)=720/12=60,即 1 个 x 步、2 个 y 步、3 个 z 步的排列数。
下面count_triple函数的时间复杂度为()
01int gcd(int a, int b){ 02 if(a==0) 03 return b; 04 return gcd(b% a,a); 05} 06int count_triple(int n){ 07 int cnt=0; 08 for(int v=1;v*v*4<=n;v++) 09 for(int u=v+1;u*(u+v)*2<=n;u+=2) 10 if(gcd(u,v)==1){ 11 int a=u*u-v*v; 12 int b=u*v*2; 13 int c=u*u+v*v; 14 cnt+=n/(a+b+c); 15 } 16 return cnt; 17}
C:O(n log n)。外层 v 与内层 u 受 u(u+v)·2≤n 约束,两层迭代总量约 O(n) 次;每次调用辗转相除 gcd 耗时 O(log n),故总 O(n log n)。
下面quick_sort
01void swap(int & a, int & b) { 02 int temp = a; 03 a = b; 04 b = temp; 05} 06int partition(int a[], int l, int r) { 07 int pivot = a[l], i = l + 1, j = r; 08 while (i <= j) { 09 while (i <= j && a[j] >= pivot) 10 j--; 11 while (i <= j && a[i] <= pivot) 12 i++; 13 if (i < j) 14 swap(a[i], a[j]); 15 } 16 // 在此处填入选项 17 return ________; // 在此处填入选项 18} 19void quick_sort(int a[], int l, int r) { 20 if (l < r) { 21 int pivot = partition(a, l, r); 22 quick_sort(a, l, pivot - 1); 23 quick_sort(a, pivot + 1, r); 24 } 25}
D:循环结束时 j 停在最后一个 ≤ pivot 的位置,把枢轴 a[l] 与 a[j] 交换使其归位并返回 j;A、B 用 i 交换或返回 i 会把划分点放错区。
下面LIS函数试图求出最长上升子序列的长度,横线处应该填入的是( )
01int max(int a, int b) { 02 return (a > b) ? a : b; 03} 04int LIS(vector<int> & nums) { 05 int n = nums.size(); 06 if (n == 0) return 0; 07 vector<int> dp(n, 1); 08 int maxLen = 1; 09 for (int i = 1; i < n; i++) { 10 for (int j = 0; j < i; j++) 11 if (nums[j] < nums[i]) 12 ; // 在此处填入选项 13 maxLen = max(maxLen, dp[i]); 14 } 15 return maxLen; 16}
D:dp[i]=max(dp[i],dp[j]+1)。以 nums[i] 结尾的最长上升子序列可由任意满足 nums[j]<nums[i] 的前缀转移;A、B 去更新 dp[j] 方向反了。
下面LIS函数试图求出最长上升子序列的长度,其时间复杂度为( )
01#define INT_MIN (-1000) 02int LIS(vector<int> & nums) { 03 int n = nums.size(); 04 vector<int> tail; 05 tail.push_back(INT_MIN); 06 for (int i = 0; i < n; i++) { 07 int x = nums[i], l = 0, r = tail.size(); 08 while (l < r) { 09 int mid = (l + r) / 2; 10 if (tail[mid] < x) 11 l = mid + 1; 12 else 13 r = mid; 14 } 15 if (r == tail.size()) 16 tail.push_back(x); 17 else 18 tail[r] = x; 19 } 20 return tail.size() - 1; 21}
C:O(n log n)。维护递增 tail 数组,对每个元素二分查找第一个 ≥x 的位置替换或追加,n 个元素各 O(log n),总 O(n log n)。
下面的程序使用邻接矩阵表达的带权无向图,则从顶点0到顶点3的最短距离为( )。
01int weight[4][4] = { 02 { 0, 5, 8, 10}, 03 { 5, 0, 1, 7}, 04 { 8, 1, 0, 3}, 05 {10, 7, 3, 0}};
A:9。路径 0→1(权 5)、1→2(权 1)、2→3(权 3)总长 5+1+3=9;直达 0→3 为 10,0→2→3 为 8+3=11,均更远。
C++语言中,表达式9 | 12 的结果类型为int 、值为13 。
A:正确。9=0b1001,12=0b1100,按位或得 0b1101=13,两个 int 按位或结果类型仍为 int。
C++语言中,访问数据发生下标越界时,总是会产生运行时错误,从而使程序异常退出。
B:错误。数组越界是未定义行为:可能直接崩溃,也可能静默读写相邻内存而不报错,『总是产生运行时错误』不成立;C++ 不检查越界。
对个元素的数组进行归并排序,最差情况的时间复杂度为 。
A:正确。归并排序无论输入顺序如何都先对半划分再线性合并,最差、平均、最好均为 O(n log n),且需要 O(n) 辅助空间。
个相同的红球和个相同的蓝球排成一排,要求每个蓝球的两侧都必须至少有一个红球,则一共有种排列方案。
B:错误。先排 5 个红球,蓝球既不能相邻也不能占据两端空位,只能插入中间 4 个空位各 1 个,方案仅 1 种;15 是允许放两端的 C(6,4)。
第 5 题 使用math.h 或cmath 头文件中的函数,表达式 log(8) 的结果类型为double 、值约为3 。
B:错误。log 是自然对数,ln 8≈2.079 而非 3;值为 3 的是以 2 为底的对数 log₂8。返回类型为 double 这一点正确。
C++是一种面向对象编程语言,C则不是。继承是面向对象三大特性之一,因此,使用C语言无法实现继承。
A:错误。C 语言没有内建继承语法,但可把基类结构体嵌套进派生结构体(通常放首位)模拟继承并复用字段,指针也可互相转换。
个顶点的无向完全图,有棵生成树。
A:正确。Cayley 公式:n 个顶点的无向完全图 Kₙ 的生成树数量为 nⁿ⁻²,如 K₃ 有 3 棵生成树,K₄ 有 16 棵。
已知三个double类型的变量a、b和theta分别表示一个三角形的两条边长及二者的夹角(弧度),则三角形的周长可以通过表达式sqrt(a * a + b * b - 2 * a * b * cos(theta))求得。
B:错误。根式 √(a²+b²−2ab·cosθ) 由余弦定理算出的只是第三边 c,周长须再加 a+b,表达式缺少两边的和。
有 个顶点、 条边的图的深度优先搜索遍历时间复杂度为 。
A:正确。DFS 每个顶点访问一次、每条出边检查一次,总复杂度 O(V+E),与 BFS 相同;邻接矩阵实现才是 O(V²)。
从名学生中选出人分别担任班长、副班长、学习委员和组织委员,老师要求班级综合成绩排名最后的名学生不得参选班长或学习委员(仍可以参选副班长和组织委员),则共有 种不同的选法。
A:正确。班长、学习委员只能从非末尾的 28 人中选:P(28,2);副班长、组织委员不限,从剩余 30 人中选:P(30,2);P(28,2)·P(30,2)=28·27·30·29 恰等于 P(30,4)。