c 的 ASCII 码十进制表示是 99,那么英文字母 x 的 ASCII 码十六进制表示是( )。cout 输出变量 x,并保留 3 位小数,应该写成( )。n 个结点的树,一定有( )条边。(7, 5, 1, 12, 3, 6, 9, 4) 中有( )个逆序对。P、Q 的真假如何取值,以下逻辑表达式中一定为假的是( )。x1,x2,x3,x4,x5 个苹果。因为盘子不同,且允许某些盘子放 0 个,所以问题等价于求非负整数解的个数:x1 + x2 + x3 + x4 + x5 = 9。9 + 4 = 13 个位置中选择 4 个位置放隔板。C(13,4) = 13 × 12 × 11 × 10 / (4 × 3 × 2 × 1) = 715 种放法。G 是一个非连通无向图(没有重边和自环),共有 36 条边,则该图至少有( )个顶点。判断题正确填 A,错误填 B。阅读程序题共 40 分:第 16~18、21~23 题每题 3 分,第 19~20、24~25 题每题 4 分,第 26 题 6 分。
#include <bits/stdc++.h>using namespace std;using i64 = long long;int popcount(i64 x){ int res = 0; while (x) { if (x & 1 == 1) res++; x >>= 1; } return res;}int calc(i64 x){ int sum = 0; for (i64 i = 1; i <= x; i++) sum += popcount(i); return sum;}int sum(i64 l, i64 r){ return calc(r) - calc(l);}int main(){ i64 l, r; cin >> l >> r; cout << calc(l) << ' ' << sum(l, r) << endl; return 0;}5 8,则程序输出 7 6。( )popcount(x) 统计 x 的二进制中 1 的个数,calc(x) 统计 1 到 x 的所有 1 的个数。5 8 时,calc(5)=1+1+2+1+2=7;sum(5,8)=calc(8)-calc(5),也就是统计 6,7,8,结果为 2+3+1=6,所以输出 7 6。& 符号改为 ^ 符号,程序输出结果一定不会改变。( )x & 1 == 1 会按优先级理解为 x & (1 == 1),等价于 x & 1,用于判断最低位是否为 1。x ^ 1 == 1,会变成 x ^ (1 == 1),即 x ^ 1,含义完全不同。例如 x=1 时原判断为真,修改后为假,因此输出可能改变。#include <bits/stdc++.h> 改成 #include <stdio.h>,程序仍能正常运行。( )cin、cout、endl 等 C++ 输入输出对象,它们来自 C++ 标准库相关头文件。stdio.h 是 C 风格输入输出头文件,不提供这些对象,所以替换后程序不能正常编译运行。1 12,则输出是什么?( )calc(1),只统计数字 1 的二进制中 1 的个数,所以为 1。sum(1,12)=calc(12)-calc(1),等价于统计 2 到 12 的二进制 1 的总数:1+2+1+2+2+3+1+2+2+3+2=21。因此输出 1 21。sum 函数实现了什么功能?( )calc(r) 统计 1 到 r 每个数二进制中 1 的个数之和,calc(l) 统计 1 到 l。1 到 l 的部分被抵消,剩下的就是 l+1 到 r,也就是区间 (l,r] 内每个数二进制位上 1 的个数之和。#include <bits/stdc++.h>using namespace std;const int inf = 0x3f3f3f3f;int solve(vector<int> &cur){ int n = cur.size(); vector<vector<int>> dp(n + 1, vector<int>(n + 1, inf)); for (int i = 0; i <= n; i++) dp[0][i] = dp[i][0] = 0; for (int i = 1; i <= n; i++) dp[i][i] = cur[i - 1]; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (i != j) dp[i][j] = min(dp[i][j], dp[i - 1][j] + dp[i][j - 1]); int ans = 0; for (int i = 1; i <= n; i++) ans = max(ans, dp[n][i]); return ans;}int main(){ int n; cin >> n; vector<int> cost(n); for (int i = 0; i < n; i++) cin >> cost[i]; cout << solve(cost) << endl; return 0;}3 1 2 3,则输出为 3。( )3 1 2 3 时,n=3,cur={1,2,3}。先令 dp[1][1]=1、dp[2][2]=2、dp[3][3]=3,再按 dp[i][j]=dp[i-1][j]+dp[i][j-1] 递推非对角位置。dp[3][1]=1、dp[3][2]=3、dp[3][3]=3,取最大值得 3,所以输出为 3。dp 数组的时间复杂度是 O(n^2)。( )dp 的主要计算在两层循环中完成:外层 i=1..n,内层 j=1..n。每个状态只进行一次常数时间的判断和转移。dp 数组的时间复杂度是 O(n^2)。vector<int> cost(n + 1),输入仍为 3 1 2 3,则 solve 函数中的 n=3。( )solve 函数中的 n 来自 cur.size(),不是来自输入变量 n 本身。vector<int> cost(n) 改成 vector<int> cost(n + 1),那么传入 solve(cost) 的数组长度变为 4,所以函数内 n=4,题干说 n=3 是错误的。cost 数组为 {4,0,0,5,6} 时,程序的输出为( )。cost={4,0,0,5,6},对角线初值为 dp[1][1]=4、dp[2][2]=0、dp[3][3]=0、dp[4][4]=5、dp[5][5]=6。dp[5][1]=4、dp[5][2]=12、dp[5][3]=20、dp[5][4]=25、dp[5][5]=6,最大值是 25,所以程序输出 25。dp[i][j] = min(dp[i][j], dp[i - 1][j] - dp[i][j - 1]);,当输入的 cost 数组为 {4,0,0,5,6} 时,程序的输出为( )。dp[i-1][j]-dp[i][j-1] 更新。对 cost={4,0,0,5,6} 计算后,最后一行变为 4,-12,20,-15,6。ans 取最后一行最大值,因此最大值为 20,程序输出 20。cost 数组为 {4,0,0,5,6} 时,在 solve 函数中,dp[2][3] 的值为( )。dp[2][3] 不是对角线位置,所以会由转移式计算:dp[2][3]=min(inf, dp[1][3]+dp[2][2])。dp[2][2]=0;而 dp[1][3]=dp[0][3]+dp[1][2]=0+4=4。因此 dp[2][3]=4+0=4,选 D。给定一个整数数组 colors 和一个整数 k,其中 colors 表示由红蓝瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i](1 代表红色,0 代表蓝色)。环中连续 k 块瓷砖的颜色如果是交替颜色,则称为一个交替组。请找出交替组的个数。
#include <iostream>#include <①>using namespace std;04int main(){ int n, k; cin >> n >> k; vector<int> colors(n); for (int i = 0; i < n; i++) cin >> colors[i];12 int ans = 0, cnt = ②; for (int i = 0; i < ③; i++) { if (i > 0 && ④) cnt = 0; cnt++; ans += (⑤ && cnt >= k); }21 cout << ans << endl; return 0;}vector<int> colors(n);,说明需要使用 C++ 标准库中的 vector 容器。vector 定义在头文件 <vector> 中,因此第 ① 处应填 vector。set、string、map 分别对应集合、字符串和映射容器,都不能提供这里需要的 vector<int> 定义。cnt 用来记录当前已经连续交替的瓷砖数量。刚开始还没有处理任何瓷砖,所以连续长度应从 0 开始。cnt++,表示把当前瓷砖计入当前连续段。1 或更大,会导致第一块瓷砖被多算;如果设为 -1,又会少算。因此第 ② 处应填 0。k 块可能会跨过数组末尾回到数组开头。为了处理这种跨越边界的情况,程序使用 i % n 把下标映射回原数组。n,只能检查从每个位置开始但不跨边界的情况;如果多遍历一圈,到 2 * n,就能把环展开成两段相同序列,从而检查跨边界的交替组。2 * n。cnt 清零后重新计数。2 * n,下标 i 可能超过原数组范围,所以访问颜色时必须写成 colors[i % n] 和 colors[(i - 1) % n]。colors[i % n] == colors[(i - 1) % n]。cnt >= k 表示当前已经形成了至少 k 个连续交替瓷砖,可以贡献一个交替组。n 次遍历主要是在建立连续交替长度;真正统计以环中每个位置为终点的交替组时,需要等到展开后的第二圈,也就是 i >= n 后再计数。这样可以避免同一组在第一圈和第二圈中被重复统计。i >= n,完整语句为 ans += (i >= n && cnt >= k);。