#A. 保山市 2026 年中小学生信奥赛初赛

    Type: Objective

保山市 2026 年中小学生信奥赛初赛

You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.

保山市 2026 年中小学生信奥赛初赛

C++语言试题

时间:2026 年 5 月 15 日

考生注意事项:

  • 满分 100 分。
  • 不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。

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

  1. 在 C++ 语言中,以下哪个关键字用于在堆上动态分配内存?( ) {{ select(1) }}
  • malloc
  • new
  • create
  • alloc
  1. 有 5 个元素,按照 1, 2, 3, 4, 5 的顺序进入栈 S,请问下列哪个出栈序列是合法的?( ) {{ select(2) }}
  • 5, 4, 3, 2, 1
  • 1, 5, 2, 4, 3
  • 3, 1, 2, 4, 5
  • 4, 5, 1, 2, 3
  1. a = false, b = true, c = true,以下逻辑运算表达式值为假的是( )。 {{ select(3) }}
  • (a ∧ b) ∨ c
  • (a ∨ b) ∧ c
  • a ∧ (b ∨ c)
  • (a ∧ c) ∨ b
  1. 在包含 N 个元素的无序数组中,使用顺序查找算法查找一个元素,在最坏情况下的比较次数是( )。 {{ select(4) }}
  • 1
  • log N
  • N
  • N-1
  1. 对于一个具有 n 个顶点的有向强连通图,至少需要( )条边。 {{ select(5) }}
  • n-1
  • n
  • n+1
  • 2n
  1. 表达式 (a + b) * (c - d) / e 的后缀表达式为( ),其中 +、-、*、/ 是运算符。 {{ select(6) }}
  • ab+cd-*e/
  • abcd-+*e/
  • ab+cd-/e*
  • ab+cd-e*/
  1. 以下排序算法中,最坏情况下时间复杂度最低的是( )。 {{ select(7) }}
  • 冒泡排序
  • 插入排序
  • 快速排序
  • 归并排序
  1. 十六进制数 2E.8 对应的十进制数是( )。 {{ select(8) }}
  • 46.5
  • 46.25
  • 46.125
  • 46.75
  1. 令根结点的高度为 1,则一棵含有 1024 个结点的完全二叉树的高度为( )。 {{ select(9) }}
  • 9
  • 10
  • 11
  • 12
  1. 一个五位数的车牌,每一位可以是 0-9 的数字。如果将这个数字倒过来看(0->0, 1->1, 6->9, 8->8, 9->6),恰好还是原数。这样的车牌共有多少个?( ) {{ select(10) }}
  • 75
  • 100
  • 125
  • 150
  1. 用数字卡片 0, 1, 2, 2, 3 组成不同的三位数(数字卡片不能重复使用,但两个2视为不同数字卡片),共有( )种。 {{ select(11) }}
  • 24
  • 26
  • 36
  • 48
  1. 考虑如下递归算法:

    int func(int n) {
        if (n <= 2) return n;
        if (n % 2 == 0) return func(n-1) + n;
        else return func(n-2) * n;
    }
    

    调用 func(6) 的返回结果是( )。 {{ select(12) }}

  • 15
  • 21
  • 45
  • 90
  1. 字符串 "abacaba" 中,内容互不相同的子串(连续)有( )个。 {{ select(13) }}
  • 20
  • 21
  • 22
  • 23
  1. 有五个人要过一座桥,每次最多两人,过桥时必须持有一盏灯。五人单独过桥时间分别为 1, 3, 5, 8, 12 分钟,两人一起过桥时间以较慢者为准。在灯只能由人带过桥的情况下,全部过桥的最短总时间是( )分钟。 {{ select(14) }}
  • 26
  • 27
  • 28
  • 29
  1. 一个班级有 5 个男生 和 ​5 个女生。如果要选出一个 3 人 的小组,并且小组中必须 ​至少包含 1 个女生,那么有多少种可能的组合? {{ select(15) }}
  • 100
  • 110
  • 120
  • 130

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

(1)

#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    int c = a ^ b;
    int d = a & b;
    int e = c & (~d);
    int f = (c >> 1) & (~d);
    cout << e + f << endl;
    return 0;
}

判断题

  1. 若输入 a=0, b=0,输出为 0。( ) {{ select(16) }}
  • ×
  1. 若输入 a=1, b=1,输出为 1。( ) {{ select(17) }}
  • ×
  1. 对于任意非负整数 a, b,输出结果一定小于等于 a+b。( ) {{ select(18) }}
  • ×
  1. 若输入 a=5, b=3,输出为 6。( ) {{ select(19) }}
  • 错×

单选题

  1. 若输入 a=7, b=11,输出为( )。 {{ select(20) }}
  • 2
  • 4
  • 8
  • 16
  1. 若输入 a=15, b=9,输出为( )。 {{ select(21) }}
  • 4
  • 6
  • 8
  • 10

(2)

#include <iostream>
using namespace std;

long long n, ans;
int k, len;
long long d[1000000];

int main() {
    cin >> n >> k;
    d[0] = 1;
    len = 1;
    ans = 0;
    for (long long i = 1; i < n; ++i) {
        int carry = 0;
        for (int j = 0; j < len; ++j) {
            d[j] = d[j] * k + carry;
            carry = d[j] / 10;
            d[j] %= 10;
        }
        while (carry) {
            d[len++] = carry % 10;
            carry /= 10;
        }
        ans += len;
    }
    cout << ans << endl;
    return 0;
}

假设输入的 n 是不超过 10610^6 的正整数,k 是不超过 10 的正整数。

判断题

  1. 若 k=1,输出结果等于 n-1。( ) {{ select(22) }}
  • ×
  1. 若 k=10,输出结果等于 n* (n-1) / 2。( ) {{ select(23) }}
  • ×
  1. 程序中的数组 d 可能会发生下标越界。( ) {{ select(24) }}
  • ×

单选题

  1. 若 n=5, k=2,输出结果为( )。 {{ select(25) }}
  • 4
  • 5
  • 6
  • 7
  1. 若 n=10, k=3,输出结果约为( )。 {{ select(26) }}
  • 15
  • 25
  • 55
  • 85
  1. 若 n=20, k=10,输出结果约为( )。 {{ select(27) }}
  • 100
  • 200
  • 300
  • 400

(3)

#include <iostream>
using namespace std;

const int MAXN = 1000;
int n;
int a[MAXN];
int b[MAXN];

int solve(int l, int r, int h) {
    if (l > r) return 0;
    int min_h = a[l], pos = l;
    for (int i = l+1; i <= r; i++) {
        if (a[i] < min_h) {
            min_h = a[i];
            pos = i;
        }
    }
    int left = solve(l, pos-1, min_h);
    int right = solve(pos+1, r, min_h);
    return (min_h - h) + left + right;
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    cout << solve(0, n-1, 0) << endl;
    return 0;
}

判断题

  1. 若 a 数组所有元素相等,输出等于 a[0]。( ) {{ select(28) }}
  • ×
  1. 若 n=1,输出等于 a[0]。( ) {{ select(29) }}
  • ×

选择题

  1. 当 n=100 时,最坏情况下,函数 solve 的递归调用次数最接近( )。 {{ select(30) }}
  • 100
  • 200
  • 500
  • 1000
  1. 当 n=100 时,最好情况下,solve 函数中 for 循环的总执行次数最接近( )。 {{ select(31) }}
  • 100
  • 500
  • 1000
  • 5000
  1. 若输入 n=6, a = {2, 1, 4, 3, 6, 5},输出为( )。 {{ select(32) }}
  • 6
  • 7
  • 8
  • 9
  1. (2.5分)若输入 n=7, a = {5, 3, 1, 2, 4, 6, 0},输出为( )。 {{ select(33) }}
  • 12
  • 11
  • 10
  • 9

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

(1)(顺序查找)

给定一个长度为 n 的整数数组和一个目标值 target,查找目标值在数组中第一次出现的位置(下标从 0 开始)。如果不存在,返回 -1。 补全程序。

#include <iostream>
using namespace std;

int linearSearch(int arr[], int n, int target) {
    for (int i = 0; i < ①; i++) {
        if (②) {
            return ③;
        }
    }
    return ④;
}

int main() {
    int n, target;
    cin >> n;
    int arr[n];
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    cin >> target;
    int result = linearSearch(arr, n, target);
    if (result == ⑤) {
        cout << "Not found" << endl;
    } else {
        cout << "Found at index: " << result << endl;
    }
    return 0;
}
  1. ①处应填( ) {{ select(34) }}
  • n
  • n - 1
  • n + 1
  • 100
  1. ②处应填( ) {{ select(35) }}
  • arr[i] == target
  • arr[i] != target
  • i == target
  • arr[target] == i
  1. ③处应填( ) {{ select(36) }}
  • arr[i]
  • target
  • i
  • n
  1. ④处应填( ) {{ select(37) }}
  • 0
  • n
  • -1
  • target
  1. ⑤处应填( ) {{ select(38) }}
  • 0
  • -1
  • n
  • target

(2) (最长公共子序列 LCS)

给定两个字符串 text1text2,返回它们的最长公共子序列的长度。 补全动态规划算法。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int lcs(string text1, string text2) {
    int m = text1.length();
    int n = text2.length();
    vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
    for (int i = 1; i <= m; i++) {
        for (int j = ①; j <= n; j++) {
            if (②) {
                dp[i][j] = ③;
            } else {
                dp[i][j] = ④;
            }
        }
    }
    return ⑤;
}

int main() {
    string s1, s2;
    cin >> s1 >> s2;
    cout << lcs(s1, s2) << endl;
    return 0;
}
  1. ①处应填( ) {{ select(39) }}
  • 0
  • 1
  • i
  • i+1
  1. ②处应填( ) {{ select(40) }}
  • text1[i] == text2[j]
  • text1[i-1] == text2[j-1]
  • text1[i] != text2[j]
  • i == j
  1. ③处应填( ) {{ select(41) }}
  • dp[i-1][j-1] + 1
  • dp[i-1][j] + 1
  • dp[i][j-1] + 1
  • dp[i-1][j-1]
  1. ④处应填( ) {{ select(42) }}
  • max(dp[i-1][j], dp[i][j-1])
  • min(dp[i-1][j], dp[i][j-1])
  • dp[i-1][j-1]
  • max(dp[i-1][j], dp[i][j-1]) + 1
  1. ⑤处应填( ) {{ select(43) }}
  • dp[m][n]
  • dp[m-1][n-1]
  • max(m, n)
  • min(m, n)

test

Not Attended
Status
Done
Rule
OI
Problem
1
Start at
2026-4-14 17:45
End at
2026-4-14 19:45
Duration
2 hour(s)
Host
Partic.
2