10 #J0003. CSP-J 2025 初赛模拟卷 3

CSP-J 2025 初赛模拟卷 3

普及组 CSP-J2025 初赛模拟卷 3

一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)

第 1 题 如果 aabb 都是 char 类型的变量,下列哪个语句不符合 CC++ 语法?( ) {{ select(1) }}

  • b = ++a;
  • b = 'a'++;
  • b = 'a' + 1;
  • b = a++;

第 2 题 泛洪填充算法属于( )算法。 {{ select(2) }}

  • 贪心
  • 二分
  • 动态规划
  • 搜索

第 3 题 在下列代码的横线处填写( ),可以使得输出是5 8

#include<bits/stdc++.h>
using namespace std;
int main() {
    int x = 8, y = 5;
    _________;
    x = x ^ y;
    y = x ^ y;
    cout << x << " " << y << endl;
    return 0;
}

{{ select(3) }}

  • x = x ^ y;
  • y = x ^ y;
  • c = x + y;
  • x = x + y;

第 4 题 小写字母 aaASCIIASCII 码值为 9797,小写字母 zzASCIIASCII 码值用八进制数表示为( ) {{ select(4) }}

  • 170170
  • 174174
  • 172172
  • 171171

第 5 题nn 个正整数 1,2,...,n1, 2, ..., n 中任意取出两个不同的数,若取出的两数之和等于 55 的概率为 114\frac{1}{14},则 nn 为( )。 {{ select(5) }}

  • 66
  • 77
  • 88
  • 99

第 6 题 下面不可以用作 CC++ 程序中的变量名的是( ) {{ select(6) }}

  • cstr
  • cint
  • pops
  • this

第 7 题 设有 nn 个数和 mm 个桶,桶排序算法(桶内采用插入排序)在最坏情况下的时间复杂度是( ) {{ select(7) }}

  • O(nm)O(nm)
  • O(n+m)O(n + m)
  • O(n2)O(n^2)
  • O(nlogn)O(nlogn)

第 8 题 一个二维数组定义为 long long a[5][8];,则这个二维数组占用内存空间的大小为( )字节。 {{ select(8) }}

  • 320320
  • 160160
  • 8080
  • 4040

第 9 题 下列关于 CC++ 语言中自定义函数的叙述,正确的是( ) {{ select(9) }}

  • 自定义函数的参数可以是结构体类型
  • 自定义函数的参数不能超过五个
  • 自定义函数必须有返回值
  • 自定义函数定义必须写在调用它的函数前面,否则会发生编译错误

第 10 题 为了防范计算机病毒,保护个人隐私和信息安全,下列做法中正确的是( )。 {{ select(10) }}

  • 每六个月更换一次计算机的登录密码,密码采用大小写英文字母和数字混合的形式,位数多于 88
  • 手机收到提示中奖的短信,点开链接看看是否真的中奖了
  • 将个人的私密照片和视频发到同学间建立的 QQQQ
  • 借用同学的 UU 盘将下载的网络游戏安装包复制到自己的笔记本计算机中

第 11 题 下列代码可以用来求最长上升子序列(LISLIS)的长度,如果输入是 5 1 7 3 5 9,则输出是( )。

#include <bits/stdc++.h>
using namespace std;
int a[2025], dp[2025];
int main() {
    int n, i, j, ret = -1;
    cin >> n;
    for (i = 1; i <= n; ++i) {
        cin >> a[i];
        dp[i] = 1;
    }
    for (i = 1; i <= n; ++i)
        for (j = 1; j < i; ++j)
            if (a[j] < a[i])
                dp[i] = max(dp[i], dp[j] + 1);
    for (i = 1; i <= n; ++i){
        ret = max(ret, dp[i]);
        cout << dp[i] << " ";
    }
    cout << ret << endl;
    return 0;
}

{{ select(11) }}

  • 9 7 5 1 1 9
  • 1 2 2 3 4 4
  • 1 3 5 7 9 9
  • 1 1 1 1 1 1

第 12 题 已知逻辑表达式 A = trueB = C = D = false,则以下逻辑表达式中取值为真的是( ) {{ select(12) }}

  • (C∧D∨¬A)∨(A∧C∨D)
  • ¬((A∧B∨C)∧(D∨B))
  • (A∧(B∨C∨D))∨(A∧D)
  • (A∨(C∨D))∧(B∨C)

第 13 题 某二叉树的前序遍历序列为 ABDFCEGH,中序遍历序列为 BFDAGEHC,则下列说法中正确的是( ) {{ select(13) }}

  • 树的高度为 33
  • AA 的右子树共有 44 个结点
  • 树可能有 44 个叶子结点或者 22 个叶子结点
  • 以上说法都不对

第 14 题pp21002\sim 100 范围内的质数,p3+7p2p^3 + 7p^2 为完全平方数,则 pp 的取值有( )种不同的可能。 {{ select(14) }}

  • 22
  • 11
  • 33
  • 00

第 15 题 在图的广度优先搜索中,既要维护一个标志数组来标志已访问的结点,还需使用( )结构存放结点以实现遍历。 {{ select(15) }}

  • 队列
  • 哈希表

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×;除特殊说明外,判断题每题 1.5 分,选择题每题 3 分,共计 40 分)

(1)

01 #include <bits/stdc++.h>
02 using namespace std;
03
04 bool isValid(string s) {
05     stack<char> stk;
06     for (char ch : s) {
07         if (ch == '(' || ch == '[' || ch == '{') {
08             stk.push(ch);
09         } else {
10             if (stk.empty()){
11                 return false;
12			   }
13             if (ch == ')' && stk.top() != '(') {
14                 return false;
15             }
16
17             if (ch == ']' && stk.top() != '[') {
18                 return false;
19             }
20
21             if (ch == '}' && stk.top() != '{') {
22                 return false;
23             }
24
25             stk.pop();
26         }
27     }
28     return stk.empty();
29 }
30
31 int main() {
32     string s;
33     cin >> s;
34     if (isValid(s))
35         cout << "Valid" << endl;
36     else
37         cout << "Invalid" << endl;
38     return 0;
39 }

第 16 题 若程序输入 ({[]}),则程序输出 Valid。 {{ select(16) }}

第 17 题 若将第 101210\sim 12 行代码删除,则程序依然可以正常运行。 {{ select(17) }}

第 18 题 若删除头文件 <bits/stdc++.h>,则只需要添加 <iostream> 头文件就可以通过编译。 {{ select(18) }}

第 19 题 若输入((({{[]}}})),则输出是什么?( ) {{ select(19) }}

  • Valid
  • Invalid
  • invalid
  • valid

第 20 题 这个程序的时间复杂度是多少?( ) {{ select(20) }}

  • O(n)O(n)
  • O(n2)O(n^2)
  • O(nlogn)O(nlogn)
  • O(nn)O(n \sqrt n)

(2)

01 #include<bits/stdc++.h>
02 using namespace std;
03
04 int main() {
05     int n;
06     cin >> n;
07     vector<int> a(n);
08     for (int i = 0; i < n; i++)
09         cin >> a[i];
10     vector<int> dp(n + 1, 0);
11     for (int i = 0; i < n; i++) {
12         if (i >= 2)
13             dp[i] = max(dp[i - 1], dp[i - 2] + a[i]);
14         else
15             dp[i] += a[i];
16         if (i >= 1)
17             dp[i] = max(dp[i], dp[i - 1]);
18     }
19     int ans = 0;
20     for (int i = 0; i < n; i++)
21         ans = max(ans, dp[i]);
22     cout << ans << endl;
23     return 0;
24 }

第 21 题 若输入 5 2 7 9 3 1,则输出为 1212。 {{ select(21) }}

第 22 题 这段代码对应的状态转移方程为 dp[i] = max(dp[i-1], dp[i-2] + a[i]), i >= 2; 初值为 dp[0] = a[0], dp[1] = a[1]。 {{ select(22) }}

第 23 题22 分)在主函数中,访问 dp[n] 不会发生越界错误。 {{ select(23) }}

第 24 题 当输入的 aa 数组为 {2, 1, 1, 2} 时,程序的输出为( ) {{ select(24) }}

  • 11
  • 22
  • 33
  • 44

第 25 题 若将第 1313 行改为 dp[i] = max(dp[i-1], dp[i-2] = a[i]);,则当输入的 aa 数组为 {10, 1, 0, 25, 3} 时,程序的输出为( ) {{ select(25) }}

  • 11
  • 1010
  • 3535
  • 2525

第 26 题44 分)当输入的 aa 数组为 {0, 2, 3, 0, 5, 6, 0, 8, 9} 时,程序的输出为( ) {{ select(26) }}

  • 1818
  • 3333
  • 3434
  • 22

(3)

01 #include<bits/stdc++.h>
02 using namespace std;
03
04 int bfs(vector<vector<int>>& grid) {
05     const int m = grid.size(), n = grid[0].size();
06     const int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};
07     using pii = pair<int, int>;
08     queue<pii> q;
09     vector<vector<bool>> vis(m + 1, vector<bool>(n + 1));
10     int ans = 0, tot = 0, cnt = 0;
11     for (int i = 0; i < m; i++)
12         for (int j = 0; j < n; j++){
13             if (grid[i][j] == 2)
14                 q.push({i, j}), vis[i][j] = 1;
15             tot += (grid[i][j] != 0);
16		   }
17     while (!q.empty()) {
18         int cur = q.size();
19         for (int i = 1; i <= cur; i++) {
20             auto u = q.front();
21             int x = u.first, y = u.second;
22             q.pop();
23             cnt++;
24             for (int j = 0; j < 4; j++) {
25                 int cx = x + dx[j], cy = y + dy[j];
26                 if (cx < 0 || cx >= m || cy < 0 || cy >= n || vis[cx][cy] || grid[cx][cy] == 0)
27                     continue;
28                 if (grid[cx][cy] == 1)
29                     q.push({cx, cy}), vis[cx][cy] = 1;
30             }
31         }
32		   ans++;
33     }
34     if (tot == cnt)
35         return max(0, ans - 1);
36     else
37         return -1;
38 }
39
40 int main() {
41     int m, n;
42     cin >> m >> n;
43     vector<vector<int>> a(m, vector<int>(n));
44     for (int i = 0; i < m; i++)
45         for (int j = 0; j < n; j++)
46             cin >> a[i][j];
47     cout << bfs(a) << endl;
48     return 0;
49 }

第 27 题 当输入的 aa 数组为 {{2, 1, 1}, {1, 1, 0}, {0, 1, 1}} 时,程序的输出为 44。 {{ select(27) }}

第 28 题 bfs 函数的时间复杂度为 O(nm)O(nm)。 {{ select(28) }}

第 29 题 由代码可知,格子中的一个 22 可以把八个方向上的 11 都变为 22。 {{ select(29) }}

第 30 题 当输入的 aa 数组为 {{2, 1, 1}, {0, 1, 1}, {1, 0, 1}} 时,程序的输出为( ) {{ select(30) }}

  • 1-1
  • 22
  • 33
  • 44

第 31 题44 分)如果删掉 bfs 函数中与 vis 数组相关的内容,不可能发生的结果是( ) {{ select(31) }}

  • 不影响结果,答案依然正确
  • 某个格子会重复进入队列,但答案依然正确
  • 某个格子会重复进入队列,将得到不正确的答案
  • 无法控制格子的入队次数,内存超限

第 32 题 当输入的 aa 数组为 {{0, 2}} 时,程序的输出为( ) {{ select(32) }}

  • 00
  • 11
  • 1-1
  • 发生运行时错误

三、完善程序(单选题,每小题 3 分,共计 30 分)

(1)题目描述

给定一个长度小于或等于 10610^6 的只包含小写英文字母的字符串 ss,输出有多少个子串满足以 heavy 开头并且以 metal 结尾。

01 #include<bits/stdc++.h>
02 using namespace std;
03
04 int main() {
05     string s;
06     cin >> s;
07     long long cnt = ①, ans = 0;
08     for (int i = 4; ②; i++) {
09         auto cur = ③;
10         if (④)
11             cnt++;
12         else if (cur == "metal")
13             ⑤;
14     }
15     cout << ans << endl;
16     return 0;
17 }

第 33 题 ①处应填( ) {{ select(33) }}

  • 00
  • 1E91E9
  • 1E9-1E9
  • 2E9-2E9

第 34 题 ②处应填( ) {{ select(34) }}

  • i < s.length()
  • i <= s.length()
  • i < s.length() - 1
  • i >= s.length()

第 35 题 ③处应填( ) {{ select(35) }}

  • s.substr(i, 5)
  • s.substr(i - 5, 5)
  • s.substr(i - 4, 5)
  • s.substr(i - 5)

第 36 题 ④处应填( ) {{ select(36) }}

  • cur == heavy
  • cur == "heavy"
  • cur != heavy
  • cur != "heavy"

第 37 题 ⑤处应填( ) {{ select(37) }}

  • ans++
  • ans += cnt
  • cnt += ans
  • cnt++

(2)题目描述

输入 llrr1lr10181 \le l \le r \le 10^{18})。如果整数 xx 的首位数字等于末位数字,那么称 xx 是合法数字。例如 101,477474,9101, 477474, 9 是合法数字,而 47,253,102047, 253, 1020 不是合法数字。输出 [l,r][l, r] 中有多少个合法数字?

01 #include<bits/stdc++.h>
02 using namespace std;
03 long long l, r;
04 long long fir(long long g) {
05     while (g >= 10)
06         ①;
07     return g;
08 }
09 long long fin(long long g) {
10     return g % 10;
11 }
12 long long solve(long long n) {
13     if (n <= 9)
14         return n;
15     else {
16         long long base = ( ② );
17         long long first = fir(n);
18         bool flag = ( ③ );
19         return ④;
20     }
21 }
22 int main() {
23     cin >> l >> r;
24     cout << ⑤ << endl;
25     return 0;
26 }

第 38 题 ①处应填( ) {{ select(38) }}

  • g /= 10
  • g -= 10
  • g %= 10
  • g ^= 10

第 39 题 ②处应填( ) {{ select(39) }}

  • n % 10 + 9
  • n % 10
  • n / 10
  • n / 10 + 9

第 40 题 ③处应填( ) {{ select(40) }}

  • fir(n) < fin(n)
  • fir(n) <= fin(n)
  • fir(n) > fin(n)
  • fir(n) >= fin(n)

第 41 题 ④处应填( ) {{ select(41) }}

  • base + flag
  • base
  • flag
  • base - flag

第 42 题 ⑤处应填( ) {{ select(42) }}

  • solve(r)
  • solve(l)
  • solve(r) - solve(l - 1)
  • solve(r) - solve(l)