A. CSP-J初赛模拟卷25-1

    客观题

CSP-J初赛模拟卷25-1

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

普及组 CSP-J 2025 初赛模拟卷 1

一、单项选择题

  1. 在标准 ASCII 码表中,已知英文字母 c 的 ASCII 码十进制表示是 99,那么英文字母 x 的 ASCII 码十六进制表示是( )。 {{ select(1) }}
  • 77
  • 78
  • 79
  • 7A
  1. 以下关于 CSP 与 GESP 的描述正确的是( )。 {{ select(2) }}
  • CSP-J/CSP-S 属于非专业级别软件能力认证,只有中小学生才能参加
  • CSP-J/CSP-S 是中国通信学会举办的程序设计竞赛
  • GESP 是中国电子学会举办的程序设计竞赛
  • GESP C++ 七级成绩 80 分及以上或者八级成绩 60 分及以上,可以申请免 CSP-J 初赛
  1. 以下可以用作 C++ 程序中的变量名的是( )。 {{ select(3) }}
  • _x1
  • new
  • class
  • public
  1. 以下不属于桌面或者手机操作系统的是( )。 {{ select(4) }}
  • Linux
  • Android
  • MATLAB
  • Windows 11
  1. C++中使用输入和输出函数 cin 和 cout 会用到( )头文件。 {{ select(5) }}
  • iostream
  • cmath
  • csidio
  • algorithm
  1. 寻找最短路径的广度优先搜索算法经常用到的数据结构是( )。 {{ select(6) }}
  • 链表
  • 向量
  • 队列
  1. 以下哪个域名后缀不属于中华人民共和国管辖?( ) {{ select(7) }}
  • cn
  • uk
  • hk
  • mo
  1. 下列排序算法中,平均情况下( )算法的时间复杂度最小。 {{ select(8) }}
  • 插入排序
  • 选择排序
  • 归并排序
  • 冒泡排序
  1. 关于计算机网络,下面的说法中正确的是( )。 {{ select(9) }}
  • TCP 是网络层协议
  • 计算机病毒只能通过 U 盘等介质传播,不能通过计算机网络传播
  • 计算机网络可以实现资源共享
  • 公司内部的几台计算机组成的网络规模太小,不能称为计算机网络
  1. 序列(7, 5, 1, 12, 3, 6, 9, 4)的逆序对有( )个。 {{ select(10) }}
  • 15
  • 12
  • 13
  • 14
  1. 下列属于图像文件格式的是( )。 {{ select(11) }}
  • MPEG
  • DOCX
  • JPEG
  • WMV
  1. 不管 P、Q 如何取值,以下逻辑表达式中取值恒为假的是( )。 {{ select(12) }}
  • (¬Q∧P)∨(Q∧¬P)
  • ((¬P∨Q)∨(P∨¬Q))∧P∧¬Q
  • ¬P∧((¬Q∨P)∨(Q∨¬P))∧P
  • ((¬P∨Q)∨(Q∨¬P))∧Q∧¬P
  1. 树的根结点的高度为 1,某完全二叉树有 2025 个结点,其高度是( )。 {{ select(13) }}
  • 10
  • 11
  • 12
  • 13
  1. 现有 9 个苹果,要放入 5 个不同的盘子,允许有的盘子中放 0 个苹果,则不同的放法共有( )种。 {{ select(14) }}
  • 720
  • 715
  • 126
  • 252
  1. G 是一个非连通无向图(没有重边和自环),共有 36 条边,则该图至少有( )个顶点。 {{ select(15) }}
  • 6
  • 9
  • 10
  • 8

二、阅读程序

程序一

01 #include <bits/stdc++.h>
02 using namespace std;
03
04 using i64 = long long;
05
06 int popcount(i64 x)
07 {
08    int res = 0;
09    while(x)
10    {
11    if(x & 1 == 1)
12    res++;
13    x >>= 1;
14    }
15    return res;
16 }
17
18 int calc(i64 x)
19 {
20    int sum = 0;
21    for(i64 i = 1; i <= x; i++)
22    sum += popcount(i);
23    return sum;
24 }
25
26 int sum(i64 l, i64 r)
27 {
28    return calc(r) - calc(l);
29 }
30
31 int main()
32 {
33    i64 l, r;
34    cin >> l >> r;
35    cout << calc(l) << ' ' << sum(l, r) << endl;
36    return 0;
37 }
  1. 若程序输入为5 8,则程序输出7 6。 ( ) {{ select(16) }}
  • 正确
  • 错误
  1. 若将第11行中的&符号改为^符号,程序输出结果一定不会改变。 ( ) {{ select(17) }}
  • 正确
  • 错误
  1. 若将头文件#include <bits/stdc++.h>改成#include <stdio.h>, 程序仍能正常运行。 ( ) {{ select(18) }}
  • 正确
  • 错误
  1. 若输入为 1 12,则输出是什么?( ) {{ select(19) }}
  • 1 21
  • 1 20
  • 1 22
  • 2 22
  1. 程序中的 sum 函数实现了什么功能?( ) {{ select(20) }}
  • 计算了 [1, r]区间内的每个数二进制位上 1 的个数之和
  • 计算了 [1, r]区间内的每个数二进制位上 0 的个数之和
  • 计算了 (1, r]区间内的每个数二进制位上 1 的个数之和
  • 计算了 (1, r]区间内的每个数二进制位上 0 的个数之和

程序二

01 #include <bits/stdc++.h>
02 using namespace std;
03
04 const int inf = 0x3f3f3f3f;
05
06 int solve(vector<int> &cur) {
07    int n = cur.size();
08    vector<vector<int>> dp(n + 1, vector<int>(n + 1, inf));
09    for(int i = 0; i <= n; i++)
10       dp[0][i] = dp[i][0] = 0;
11    for(int i = 1; i <= n; i++)
12       dp[i][i] = cur[i - 1];
13    for(int i = 1; i <= n; i++)
14       for(int j = 1; j <= n; j++)
15          if(i != j)
16             dp[i][j]=min(dp[i][j],dp[i-1][j]+dp[i][j-1]);
17    int ans = 0;
18    for(int i = 1; i <= n; i++)
19       ans = max(ans, dp[n][i]);
20    return ans;
21 }
22
23 int main()
24 {
25    int n;
26    cin >> n;
27    vector<int> cost(n);
28    for(int i = 0; i < n; i++)
29       cin >> cost[i];
30    cout << solve(cost) << endl;
31    return 0;
32 }
  1. 若输入为3 1 2 3,则输出为3。 ( ) {{ select(21) }}
  • 正确
  • 错误
  1. 计算dp数组的时间复杂度为 ( O(n^2) )。 ( ) {{ select(22) }}
  • 正确
  • 错误
  1. (2分)若将第28行改为vector<int>cost(n+1),则当输入3 1 2 3时,solve函数中的n=3。 ( ) {{ select(23) }}
  • 正确
  • 错误
  1. 当输入的cost数组为[4,0,0,5,6]时,程序的输出为( )。 {{ select(24) }}
  • 23
  • 25
  • 24
  • 22
  1. 若将第17行改为( dp[i][j] = min(dp[i][j], dp[i-1][j]) - dp[i][j-1] ),则当输入的cost数组为[4,0,0,5,6]时,程序的输出为( )。 {{ select(25) }}
  • 20
  • 21
  • 22
  • 23
  1. (4分)当输入的cost数组为[4,0,0,5,6]时,在solve函数中,dp[2][3]的值为( )。 {{ select(26) }}
  • 1
  • 2
  • 3
  • 4

程序三

01 #include <bits/stdc++.h>
02 using namespace std;
03
04 int func(int a, int b)
05 {
06    if(a == 0)
07       return b;
08    if(b == 0)
09       return a;
10    return a + func(b, a % b);
11 }
12
13 int main()
14 {
15    int x, y;
16    cin >> x >> y;
17    cout << func(x, y) << endl;
18    return 0;
19 }
  1. 当输入为 2 3 时,程序的输出为 5。 ( ) {{ select(27) }}
  • 正确
  • 错误
  1. 若输入只有一个为 0,则程序的输出为输入的另一个数字。 ( ) {{ select(28) }}
  • 正确
  • 错误
  1. 当输入为 6 8 时,func 函数将会被进入 A 次。 ( ) {{ select(29) }}
  • 正确
  • 错误
  1. 当输入为 6 8 时,程序的输出为 ( )。 {{ select(30) }}
  • 20
  • 21
  • 22
  • 23
  1. 当输入为 3 5 时,func 函数的调用顺序是 ( )。 {{ select(31) }}
  • func(3,5)-func(5,3)-func(3,2)-func(2,1)-func(1,0)
  • func(3,5)-func(5,3)-func(3,2)-func(2,1)-func(1,1)-func(1,0)
  • func(3,5)-func(5,2)-func(2,1)-func(1,1)-func(1,0)
  • func(3,5)-func(5,2)-func(2,1)-func(1,0)
  1. (4 分)若将第 10 行的代码改为 return a + func(b,a-b),则当输入为 3 5 时,得到的输出为 ( )。 {{ select(32) }}
  • 14
  • 8
  • 6
  • 产生未定义行为,结果未知

三、完善程序

程序一:

给定一个整数数组 colors 和一个整数 k,其中 colors 表示一个由红色瓷砖和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i](1 代表红色,0 代表蓝色)。环中连续 k 块瓷砖的颜色如果是交替颜色(除了第一块和最后一块瓷砖以外,中间瓷砖的颜色与它左边瓷砖和右边瓷砖的颜色都不同),那么它被称为一个交替组。现在,请你找出交替组的个数。

01 #include <iostream>
02 #include <①>
03
04 using namespace std;
05
06 int main()
07 {
08    int n, k;
09    cin >> n >> k;
10    vector<int> colors(n);
11    for(int i = 0; i < n; i++)
12       cin >> colors[i];
13    int ans = 0, cnt = ②;
14    for(int i = 0; i < ③; i++)
15    {
16       if(i > 0 && ④)
17          cnt = 0;
18       cnt++;
19       ans += (⑤ && cnt >= k);
20    }
21    cout << ans << endl;
22    return 0;
23 }
  1. ①处应填( )。 {{ select(33) }}
  • vector
  • set
  • string
  • map
  1. ②处应填( )。 {{ select(34) }}
  • -1
  • 0
  • 1
  • 2
  1. ③处应填( )。 {{ select(35) }}
  • n
  • n-1
  • 2*n
  • 2*(n-1)
  1. ④处应填( )。 {{ select(36) }}
  • colors[i] == colors[i-1]
  • colors[i] != colors[i-1]
  • colors[i % n] == colors[(i-1) % n]
  • colors[i % n] != colors[(i-1) % n]
  1. ⑤处应填( )。 {{ select(37) }}
  • i > n
  • i >= n
  • i < n
  • i <= n

程序二:

在国际象棋中,马的一次移动定义为:垂直移动两个方格后再水平移动一个方格,或者水平移动两个方格后再垂直移动一个方格(两者都形成一个L的形状)。

现在,我们有一个马和一个电话垫(如下图所示),马只能站在数字单元格上。你可以将马放置在任何数字单元格上,然后你应该执行 ( n-1 ) 次移动来获得长度为 ( n ) 的号码。马所有的移动应该是符合规则的有效的移动。马在一次移动的过程中可以经过符号单元格,但必须保证这次移动结束后马站在数字单元格上。

给定一个整数 ( n ),请你计算可以得到多少个长度为 ( n ) 的数字串。由于答案可能很大,请你输出答案对 ( 10^9+7 ) 取模后的结果。

1 2 3
4 5 6
7 8 9
* 0 #
01 #include <iostream>
02 #include <vector>
03
04 using namespace std;
05
06 const int mod = 159 + 7;
07 vector<vector<int>> pos = {{4, 6}, {6, 8}, {7, 9}, {4, 8}, {0, 3, 9},
  ①, {0, 1, 7}, {2, 6}, {1, 3}, {2, 4}};
08
09 int main()
10 {
11    int n;
12    cin >> n;
13    vector<vector<int>> dp(10, vector<int>(n + 1, 0));
14    for(int i = 0; i < 10; i++)
15       @ = 1;
16    for(int j = 2; j <= n; j++)
17    {
18       for(int i = 0; i < 10; i++)
19       {
20          for(int k = 0; k < pos[i].size(); k++)
21          {
22             dp[i][j] += dp[@][j - 1];
23             @;
24          }
25       }
26    }
27    int ans = 0;
28    for(int i = 0; i < 10; i++)
29    {
30       @;
31       ans %= mod;
32    }
33    cout << ans << endl;
34    return 0;
35 }
  1. ①处应填( )。 {{ select(38) }}
  • {1, 3, 7, 9}
  • {*, #}
  • {2, 8, 0}
  • {}
  1. ②处应填( )。 {{ select(39) }}
  • dp[i][1]
  • dp[1][i]
  • dp[i][0]
  • dp[0][i]
  1. ③处应填( )。 {{ select(40) }}
  • k
  • pos[k][i]
  • pos[i][k]
  • pos[i-1][k]
  1. ④处应填( )。 {{ select(41) }}
  • dp[i][k] %= mod
  • dp[j][i] -= mod
  • dp[i][j] %= mod
  • dp[i][j] -= mod
  1. ⑤处应填( )。 {{ select(42) }}
  • ans += dp[i][n]
  • ans += dp[i][n-1]
  • ans += dp[n][i]
  • ans += dp[n-1][i]

CSP-J初赛模拟卷25-1

未参加
状态
已结束
规则
IOI(严格)
题目
1
开始于
2025-9-5 0:00
结束于
2025-9-25 20:00
持续时间
2 小时
主持人
参赛人数
0