林老师 · 客观题题库 · CSP-J 卷

CSP-J 卷

· 共 10 题 · 由简到难 · 建议 90 分钟
真题
复刻
试卷编号OBJ-678816
题目总数10 题 · 140.0 分
试卷类型客观题
考生须知:
① 本卷为客观题单卷,合计 10 题 · 140.0 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 140.0 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

客 观 题

10 QUESTIONS · 2 POINTS EACH
第 1~6 题 阅读程序 (共 14.5 分) 未作答

1  #include <algorithm>
2  #include <iostream>
3  using namespace std;
4 
5  int n;
6  int d[50][2];
7  int ans;
8 
9  void dfs(int n, int sum) {
10      if (n == 1) {
11          ans = max(sum, ans);
12          return;
13      }
14      for (int i = 1; i < n; ++i) {
15          int a = d[i - 1][0], b = d[i - 1][1];
16          int x = d[i][0], y = d[i][1];
17          d[i - 1][0] = a + x;
18          d[i - 1][1] = b + y;
19          for (int j = i; j < n - 1; ++j)
20              d[j][0] = d[j + 1][0], d[j][1] = d[j + 1][1];
21          int s = a + x + abs(b - y);
22          dfs(n - 1, sum + s);
23          for (int j = n - 1; j > i; --j)
24              d[j][0] = d[j - 1][0], d[j][1] = d[j - 1][1];
25          d[i - 1][0] = a, d[i - 1][1] = b;
26          d[i][0] = x, d[i][1] = y;
27      }
28  }
29 
30  int main() {
31      cin >> n;
32      for (int i = 0; i < n; ++i)
33          cin >> d[i][0];
34      for (int i = 0; i < n; ++i)
35          cin >> d[i][1];
36      ans = 0;
37      dfs(n, 0);
38      cout << ans << endl;
39      return 0;
40  }

假设输入的 nn 是不超过 5050 的正整数,d[i][0]d[i][1] 都是不超过 1000010000 的正整数,完成下面的判断题和单选题。

1.

若输入 nn00,此程序可能会死循环或发生运行错误。( )

(1.5 分)
2.

若输入 nn2020,接下来的输入全为 00,则输出为 00。( )

(1.5 分)
3.

输出的数一定不小于输入的 d[i][0]d[i][1] 的任意一个。( )

(1.5 分)
4.

若输入的 nn2020,接下来的输入是 202099202000,则输出为( )。

(3 分)
5.

若输入的 nn3030,接下来的输入是 303000303055,则输出为( )。

(3 分)
6.

若输入的 nn1515,接下来的输入是 151511,以及 151511,则输出为( )。

(4 分)
CSP-J 2020 · 阅读程序 第28-33题 | 知识点 深度优先搜索、回溯、二维数组
第 7~12 题 阅读程序 (共 10.5 分) 未作答

1  #include <iostream>
2 
3  using namespace std;
4 
5  int main()
6  {
7      unsigned short x, y;
8      cin >> x >> y;
9      x = (x | x << 2) & 0x33;
10      x = (x | x << 1) & 0x55;
11      y = (y | y << 2) & 0x33;
12      y = (y | y << 1) & 0x55;
13      unsigned short z = x | y << 1;
14      cout << z << endl;
15      return 0;
16  }

7.

删去第 77 行与第 1313 行的 unsigned,程序行为不变。( )

(1.5 分)
8.

将第 77 行与第 1313 行的 short 均改为 char,程序行为不变。( )

(1.5 分)
9.

程序总是输出一个整数 0。( )

(1.5 分)
10.

当输入为 2 2 时,输出为 10。( )

(1.5 分)
11.

当输入为 2 2 时,输出为 59。( )

(1.5 分)
12.

当输入为 13 8 时,输出为( )。

(3 分)
CSP-J 2022 · 阅读程序 第16-21题 | 知识点 位与、位或、移位运算、二进制
第 13~19 题 阅读程序 (共 15 分) 未作答

1  #include <iostream>
2 
3  using namespace std;
4 
5  int n, k;
6 
7  int solve1()
8  {
9      int l = 0, r = n;
10      while (l <= r) {
11          int mid = (l + r) / 2;
12          if (mid * mid <= n) l = mid + 1;
13          else r = mid - 1;
14      }
15      return l - 1;
16  }
17 
18  double solve2(double x)
19  {
20      if (x == 0) return x;
21      for (int i = 0; i < k; i++)
22          x = (x + n / x) / 2;
23      return x;
24  }
25 
26  int main()
27  {
28      cin >> n >> k;
29      double ans = solve2(solve1());
30      cout << ans << ' ' << (ans * ans == n) << endl;
31      return 0;
32  }

假设 int3232 位有符号整数类型,输入的 n 是不超过 4700047000 的自然数、k 是不超过 int 表示范围的自然数,

13.

该算法最准确的时间复杂度分析结果为 O(logn+k)O(\log n+k)。( )

(1.5 分)
14.

当输入为 9801 1 时,输出的第一个数为 99。( )

(1.5 分)
15.

对于任意输入的 n,随着所输入 k 的增大,输出的第二个数会变成 1。( )

(1.5 分)
16.

该程序有存在缺陷。当输入的 n 过大时,第 1212 行的乘法有可能溢出,因此应当将 mid 强制转换为 6464 位整数再计算。( )

(1.5 分)
17.

当输入为 2 1 时,输出的第一个数最接近( )。

(3 分)
18.

当输入为 3 10 时,输出的第一个数最接近( )。

(3 分)
19.

当输入为 256 11 时,输出的第一个数( )。

(3 分)
CSP-J 2022 · 阅读程序 第28-34题 | 知识点 二分查找、浮点型、数据范围与溢出
第 20~25 题 阅读程序 (共 13.5 分) 未作答

1  #include <iostream>
2  #include <vector>
3  #include <algorithm>
4  using namespace std;
5 
6  int f(string x, string y) {
7      int m = x.size();
8      int n = y.size();
9      vector<vector<int>> v(m+1, vector<int>(n+1, 0));
10      for (int i = 1; i <= m; i++) {
11          for (int j = 1; j <= n; j++) {
12              if (x[i-1] == y[j-1]) {
13                  v[i][j] = v[i-1][j-1] + 1;
14              } else {
15                  v[i][j] = max(v[i-1][j], v[i][j-1]);
16              }
17          }
18      }
19      return v[m][n];
20  }
21 
22  bool g(string x, string y) {
23      if (x.size() != y.size()) {
24          return false;
25      }
26      return f(x + x, y) == y.size();
27  }
28 
29  int main() {
30      string x, y;
31      cin >> x >> y;
32      cout << g(x, y) << endl;
33      return 0;
34  }

20.

f 函数的返回值小于等于 min(n,m)。( )

(1.5 分)
21.

f 函数的返回值等于两个输入字符串的最长公共子串的长度。( )

(1.5 分)
22.

当输入两个完全相同的字符串时,g 函数的返回值总是 true。( )

(1.5 分)
23.

将第 1919 行中的 v[m][n] 替换为 v[n][m],那么该程序( )。

(3 分)
24.

当输入为 csp-j p-jcs 时,输出为( )。

(3 分)
25.

当输入为 csppsc spsccp 时,输出为( )。

(3 分)
CSP-J 2023 · 阅读程序 第21-26题 | 知识点 LCS、线性DP、二维数组
第 26~31 题 阅读程序 (共 14.5 分) 未作答

1  #include <iostream>
2  #include <cmath>
3  using namespace std;
4 
5  int solve1(int n) {
6      return n * n;
7  }
8 
9  int solve2(int n) {
10      int sum = 0;
11      for (int i = 1; i <= sqrt(n); i++) {
12          if (n % i == 0) {
13              if (n/i == i) {
14                  sum += i*i;
15              } else {
16                  sum += i*i + (n/i)*(n/i);
17              }
18          }
19      }
20      return sum;
21  }
22 
23  int main() {
24      int n;
25      cin >> n;
26      cout << solve2(solve1(n)) << " " << solve1(solve2(n)) << endl;
27      return 0;
28  }

26.

如果输入的 n 为正整数,solve2 函数的作用是计算 n 所有的因子的平方和。( )

(1.5 分)
27.

1313-1414 行的作用是避免 n 的平方根因子 i(或 n/i)进入第 1616 行而被计算两次。( )

(1.5 分)
28.

如果输入的 n 为质数,solve2(n) 的返回值为 n2+1n^2+1。( )

(1.5 分)
29.

如果输入的 n 为质数 pp 的平方,那么 solve2(n) 的返回值为( )。

(4 分)
30.

当输入为正整数时,第一项减去第二项的差值一定( )。

(3 分)
31.

当输入为 5 时,输出为( )。

(3 分)
CSP-J 2023 · 阅读程序 第27-32题 | 知识点 枚举、质数判定
第 32~37 题 阅读程序 (共 15 分) 未作答

1  #include <iostream>
2  #include <vector>
3  using namespace std;
4 
5  int compute(vector<int>& cost) {
6    int n = cost.size();
7    vector<int> dp(n+1, 0);
8    dp[1] = cost[0];
9    for (int i = 2; i <= n; i++) {
10      dp[i] = min(dp[i-1], dp[i-2]) + cost[i-1];
11    }
12    return min(dp[n], dp[n-1]);
13  }
14 
15  int main() {
16    int n;
17    cin >> n;
18    vector<int> cost(n);
19    for (int i = 0; i < n; i++) {
20      cin >> cost[i];
21    }
22    cout << compute(cost) << endl;
23    return 0;
24  }

32.

当输入的 cost 数组为 {10, 15, 20} 时,程序的输出为 15。( )

(1.5 分)
33.

如果将 dp[i-1] 改为 dp[i-3],程序可能会产生编译错误。( )

(1.5 分)
34.

程序总是输出 cost 数组中最小的元素。( )

(2 分)
35.

当输入的 cost 数组为 {1, 100, 1, 1, 1, 100, 1, 1, 100, 1} 时,程序的输出为( )。

(3 分)
36.

如果输入的 cost 数组为 {10, 15, 30, 5, 5, 10, 20},程序的输出为( )。

(4 分)
37.

若将代码中的 min(dp[i-1], dp[i-2]) + cost[i-1] 修改为 dp[i-1] + cost[i-2],输入 cost 数组为 {5, 10, 15} 时,程序的输出为( )。

(3 分)
CSP-J 2024 · 阅读程序 第21-26题 | 知识点 插入排序、数组越界
第 38~43 题 阅读程序 (共 13.5 分) 未作答

1  #include <algorithm>
2  #include <cstdio>
3  #include <cstring>
4  #define ll long long
5 
6  int n, k;
7  int a[200007];
8  int ans[200007];
9 
10  int main() {
11      scanf("%d%d", &n, &k);
12      for (int i = 1; i <= n; ++i) {
13          scanf("%d", &a[i]);
14      }
15      std::sort(a + 1, a + n + 1);
16      n = std::unique(a + 1, a + n + 1) - a - 1;
17      for (int i = 1, j = 0; i <= n; ++i) {
18          for (; j < i && a[i] - a[j + 1] > k; ++j)
19          ;
20          ans[i] = ans[j] + 1;
21      }
22      printf("%d\n", ans[n]);
23      return 0;
24  }

38.

当输入为 3 1 3 2 1 时,输出结果为 22。( )

(1.5 分)
39.

假设输入的 n 为正整数,输出的答案一定满足 n\le n1\ge 1。( )

(1.5 分)
40.

将第 1414 行的:

1  n = std::unique(a + 1, a + n + 1) - a - 1;

删除后,有可能出现与原本代码不同的输出结果。( )

(1.5 分)
41.

假设输入的 a 数组和 k 均为正整数,执行第 1818 行代码时,一定满足的条件 不包括( )。

(3 分)
42.

当输入为:n = 100, k = 2, a = {1, 2, ..., 100} 时,输出为( )。

(3 分)
43.

假设输入的 a 数组和 k 均为正整数,但 a 数组不一定有序,则若误删去第 1313 行的:

std::sort(a + 1, a + n + 1);

程序有可能出现的问题有( )。

(3 分)
CSP-J 2025 · 阅读程序 第22-27题 | 知识点 快速排序、二分查找、线性DP
第 44~49 题 阅读程序 (共 13.5 分) 未作答

1  #include <algorithm>
2  #include <cstdio>
3  #include <cstring>
4  #define ll long long
5  int f[5007][5007];
6  int a[5007], b[5007];
7  int n;
8  int main(){
9      scanf("%d", &n);
10      for (int i = 1; i <= n; ++i) {
11          scanf("%d", &a[i]);
12      }
13      for (int i = 1; i <= n; ++i) {
14          scanf("%d", &b[i]);
15      }
16      for (int i = 1; i <= n; ++i) {
17          for (int j = 1; j <= n; ++j) {
18              f[i][j] = std::max(f[i][j], std::max(f[i - 1][j], f[i][j - 1]));
19              if (a[i] == b[j]) {
20                  f[i][j] = std::max(f[i][j], f[i - 1][j - 1] + 1);
21              }
22          }
23      }
24      printf("%d\n", f[n][n]);
25      return 0;
26  }

44.

当输入为 4 1 2 3 4 1 3 2 2 时,输出为 22。( )

(1.5 分)
45.

当程序运行完毕后,对于所有的 1i,jn1 \le i,j \le n,都一定有 f[i][j]f[n][n]f[i][j] \le f[n][n]。( )

(1.5 分)
46.

将第 1818 行的 f[i][j] = std::max(f[i][j], std::max(f[i - 1][j], f[i][j - 1])); 删去后,并不影响程序运行结果。( )

(1.5 分)
47.

输出的答案满足的性质有( )。

(3 分)
48.

如果在第 1616 行的循环前加上以下两行:

1  std::sort(a + 1, a + n + 1);
2  std::sort(b + 1, b + n + 1);

则答案会( )。

(3 分)
49.

如果输入的 a = {1, 2, ..., n},而且 b 数组中数字均为 1n1 \sim n 中的正整数,则上述代码等价于下面哪个问题?( )

(3 分)
CSP-J 2025 · 阅读程序 第28-33题 | 知识点 插入排序、字符ASCII运算
第 50~55 题 阅读程序 (共 15.5 分) 未作答

1  #include <iostream>
2  using namespace std;
3 
4  const int n = 100000;
5  const int N = n + 1;
6 
7  int m;
8  int a[N], b[N], c[N], d[N];
9  int f[N], g[N];
10 
11  void init()
12  {
13      f[1] = g[1] = 1;
14      for (int i = 2; i <= n; i++) {
15          if (!a[i]) {
16              b[m++] = i;
17              c[i] = 1, f[i] = 2;
18              d[i] = 1, g[i] = i + 1;
19          }
20          for (int j = 0; j < m && b[j] * i <= n; j++) {
21              int k = b[j];
22              a[i * k] = 1;
23              if (i % k == 0) {
24                  c[i * k] = c[i] + 1;
25                  f[i * k] = f[i] / c[i * k] * (c[i * k] + 1);
26                  d[i * k] = d[i];
27                  g[i * k] = g[i] * k + d[i];
28                  break;
29              }
30              else {
31                  c[i * k] = 1;
32                  f[i * k] = 2 * f[i];
33                  d[i * k] = g[i];
34                  g[i * k] = g[i] * (k + 1);
35              }
36          }
37      }
38  }
39 
40  int main()
41  {
42      init();
43 
44      int x;
45      cin >> x;
46      cout << f[x] << ' ' << g[x] << endl;
47      return 0;
48  }

假设输入的 x 是不超过 10001000 的自然数,完成下面的判断题和单选题:

50.

若输入不为 1,把第 1313 行删去不会影响输出的结果。( )

(1.5 分)
51.

2525 行的 f[i] / c[i * k] 可能存在无法整除而向下取整的情况。( )

(2 分)
52.

在执行完 init() 后,f 数组不是单调递增的,但 g 数组是单调递增的。( )

(2 分)
53.

init 函数的时间复杂度为( )。

(3 分)
54.

在执行完 init() 后,f[1]f[2]f[3] …… f[100] 中有( )个等于 22

(3 分)
55.

当输入为 1000 时,输出为( )。

(4 分)
CSP-J 2021 · 阅读程序 第28-33题 | 知识点 欧拉筛、约数个数、约数和
第 56~61 题 阅读程序 (共 14.5 分) 未作答

1  #include <algorithm>
2  #include <iostream>
3  #include <limits>
4 
5  using namespace std;
6 
7  const int MAXN = 105;
8  const int MAXK = 105;
9 
10  int h[MAXN][MAXK];
11 
12  int f(int n, int m)
13  {
14      if (m == 1) return n;
15      if (n == 0) return 0;
16 
17      int ret = numeric_limits<int>::max();
18      for (int i = 1; i <= n; i++)
19          ret = min(ret, max(f(n - i, m), f(i - 1, m - 1)) + 1);
20      return ret;
21  }
22 
23  int g(int n, int m)
24  {
25      for (int i = 1; i <= n; i++)
26          h[i][1] = i;
27      for (int j = 1; j <= m; j++)
28          h[0][j] = 0;
29 
30      for (int i = 1; i <= n; i++) {
31          for (int j = 2; j <= m; j++) {
32              h[i][j] = numeric_limits<int>::max();
33              for (int k = 1; k <= i; k++)
34              h[i][j] = min(
35                  h[i][j],
36                  max(h[i - k][j], h[k - 1][j - 1]) + 1);
37          }
38      }
39 
40      return h[n][m];
41  }
42 
43  int main()
44  {
45      int n, m;
46      cin >> n >> m;
47      cout << f(n, m) << endl << g(n, m) << endl;
48      return 0;
49  }

56.

当输入为 7 3 时,第 1919 行用来取最小值的 min 函数执行了 449449 次。( )

(1.5 分)
57.

输出的两行整数总是相同的。( )

(1.5 分)
58.

m11 时,输出的第一行总为 n。( )

(1.5 分)
59.

算法 g(n,m) 最为准确的时间复杂度分析结果为( )。

(3 分)
60.

当输入为 20 2 时,输出的第一行为( )。

(3 分)
61.

当输入为 100 100 时,输出的第一行为( )。

(4 分)
CSP-J 2022 · 阅读程序 第22-27题 | 知识点 线性DP、递归、二维数组