#176. CSP-J 2026 初赛模拟卷 3

0

CSP-J 2026 初赛模拟卷 3

CSP-J 2026 初赛模拟卷 3

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

  1. 在计算机内部,传送、存储和加工处理数据或指令都是以( )形式进行的。 {{ select(1) }}
  • 二进制码
  • 八进制码
  • 十进制码
  • 智能拼音码
  1. 计算机的软件系统通常分为( )。 {{ select(2) }}
  • 硬件系统和软件系统
  • 高级软件和一般软件
  • 系统软件和应用软件
  • 军用软件和民用软件
  1. 关于五寸软盘读写孔,正确的说法是( )。 {{ select(3) }}
  • 从该孔读信息
  • 从该孔写信息
  • 当该孔处于封住状态时,不能删除盘中文件
  • 该孔没有作用
  1. 一棵二叉树的中序遍历序列为DGBAECHF,后序遍历序列为GDBEHFCA,则前序遍历序列为( )。 {{ select(4) }}
  • ABCDFGHE
  • ABDGCEFH
  • ACBGDFHE
  • ACEFHBGD
  1. 下列叙述中错误的是( )。 {{ select(5) }}
  • 微机应避免置于强磁场之中
  • 微机使用时间不宜过长,而应隔几小时关机一次
  • 微机应避免频繁开关,以延长其使用寿命
  • 微机不宜长期闲置不用
  1. 计算机网络最主要的优点是( )。 {{ select(6) }}
  • 运算速度快
  • 共享资源
  • 精度高
  • 存储容量大
  1. 下列4个不同进制表示的数中,最大的一个数是( )。 {{ select(7) }}
  • (220.1)10(220.1)_{10}
  • (11011011.1)2(11011011.1)_2
  • (334.1)8(334.1)_8
  • (DC.1)16(DC.1)_{16}
  1. 为了区分汉字与ASCII码,计算机中汉字编码的最高位为( )。 {{ select(8) }}
  • 1
  • 0
  • -1
  • 2
  1. 一般来说,在TCP/IP协议族中IP提供的服务属于( )。 {{ select(9) }}
  • 运输层服务
  • 会话层服务
  • 表示层服务
  • 网络层服务
  1. 通信时,模拟信号也可以用数字信道来传输,能实现模拟信号与数字信号之间转换功能的是( )。 {{ select(10) }}
  • D/A
  • A/D
  • Modem
  • Codec
  1. 一个栈的输入顺序为1,2,3,4,5,下列序列中可能是栈的输出序列的是( )。 {{ select(11) }}
  • 54312
  • 24135
  • 21543
  • 12534
  1. 不属于Internet的功能的是( )。 {{ select(12) }}
  • 聊天
  • 远程教育
  • 查询资料
  • 传送能量
  1. 下列关于计算机病毒的特性的描述中,( )不是正确的。 {{ select(13) }}
  • 潜伏性
  • 传染性
  • 高速性
  • 危害性
  1. 下面不属于网络操作系统的是( )。 {{ select(14) }}
  • UNIX
  • Windows NT
  • NetWare
  • DOS
  1. 根据《计算机软件保护条例》,中国公民开发的软件享有著作权的情形是( )。 {{ select(15) }}
  • 不论何人、何地及是否发表的软件
  • 只有公开发表的软件
  • 只有单位发表的软件
  • 只有个人在国内公开发表的软件

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

(1)

#include <bits/stdc++.h>
using namespace std;
const int Maxn = 10005;
int n,b[Maxn];
void mergesort(int *a,int l,int r){
    if (l == r) return;
    int mid = l + r >> 1;
    mergesort(a,l,mid),mergesort(a,mid + 1,r);
    int i = l, j = mid + 1, cnt = 0;
    while (i <= mid && j <= r){
        if (a[i] <= a[j]) b[++cnt] = a[i++];
        else b[++cnt] = a[j++];
    }
    while (i <= mid) b[++cnt] = a[i++];
    while (j <= r) b[++cnt] = a[j++];
    for (i=1; i<=r; i++) a[i] = b[i];
}
int a[Maxn];
int main(void){
    cin >> n;
    for (int i=1; i<=n; i++) cin >> a[i];
    mergesort(a, 1, n);
    for (int i=1; i<=n; i++) cout << a[i] << (i==n ? '\n' : ' ');
    return 0;
}

判断题

  1. (1分)该算法中参数 int *a 采用的不是传值方式。 {{ select(16) }}
  • 正确
  • 错误
  1. (1分)该算法输出最后会换行。 {{ select(17) }}
  • 正确
  • 错误
  1. 该算法中 mergesort 函数的时间复杂度为 O(nlog⁡n)O(n \log n)。 {{ select(18) }}
  • 正确
  • 错误
  1. 如果输入为 5 4 3 9 7 8,则输出为 3 4 7 8 9。 {{ select(19) }}
  • 正确
  • 错误

选择题

  1. 下列选项中与 i==n ? '\n' : ' ' 功能相同的是( )。 {{ select(20) }}
  • i!=1 ? '\n' : ' '
  • "\n"[i==n]
  • "\n"[i!=n]
  • ' '
  1. 该算法在最坏情况下的时间复杂度与( )算法相同。 {{ select(21) }}
  • 快速排序
  • 选择排序
  • 计数排序
  • 堆排序

(2)

#include <bits/stdc++.h>
using namespace std;
int i,j,k,n,m,f[10010],p1,p2,p3;
int find(int k) {
    if(f[k] == k) return k;
    return f[k] = find(f[k]);
}
int main() {
    cin >> n >> m; // 假设n,m同量级
    for (i=1; i<=n; i++) f[i] = i;
    for (i=1; i<=m; i++){
        cin >> p1 >> p2 >> p3;
        if (p1 == 1)
            f[find(p2)] = find(p3);
        if (p1 == 2){
            if (find(p2) == find(p3))
                printf("Y\n");
            else
                printf("N\n");
        }
    }
    return 0;
}

判断题

  1. 该算法中 p1 的作用是确定操作类型。 {{ select(22) }}
  • 正确
  • 错误
  1. 去掉 for (i=1; i<=n; i++) f[i] = i; 对该算法没有影响。 {{ select(23) }}
  • 正确
  • 错误
  1. 如果输入为 2 2 1 1 2 2 1 2,则输出为 Y。 {{ select(24) }}
  • 正确
  • 错误
  1. 如果输入为 2 1 2 1 2,则输出为 N。 {{ select(25) }}
  • 正确
  • 错误

选择题

  1. 该算法的时间复杂度为( )。 {{ select(26) }}
  • O(mlog⁡n)O(m \log n)
  • O(nm)O(nm)
  • O(n+m)O(n + m)
  • O(nm2)O(nm^2)
  1. 把 return f[k] = find(f[k]); 改成 return find(f[k]);,则最坏情况下算法的时间复杂度为( )。 {{ select(27) }}
  • O(mlog⁡n)O(m \log n)
  • O(nm)O(nm)
  • O(n+m)O(n + m)
  • O(nm2)O(nm^2)

(3)

#include <bits/stdc++.h>
using namespace std;
int t,x[100],a[100];
void work(int d,int i,int n){
    int k;
    if (n == 1){
        for (k=0; k<d; k++)
            printf("%3d",a[k]);
        printf("\n");
    } else for (k=i; k<t; k++)
        if (n % x[k] == 0){
            a[d] = x[k];
            work(d+1,k,n/x[k]);
        }
}
int main(){
    int i,k,n;
    cin >> n;
    for (i=n; i>1; i--)
        if (n % i == 0) x[t++]=i;
    work(0,0,n);
    return 0;
}

判断题

  1. main() 函数里的 for 循环的作用是求出 n 的所有因数。 {{ select(28) }}
  • 正确
  • 错误
  1. 该程序的作用是对 n 进行素因数分解。 {{ select(29) }}
  • 正确
  • 错误
  1. 去掉 printf("%3d", a[k]); 中的 3 对程序没有影响。 {{ select(30) }}
  • 正确
  • 错误
  1. 去掉 if (n % x[k] == 0) 对程序有影响。 {{ select(31) }}
  • 正确
  • 错误

选择题

  1. 如果输入为 2,那么输出为( )。 {{ select(32) }}
  • 2
  • 21
  • 12
  • 22
  1. 如果输入为 72,那么输出的非回车字符有( )。 {{ select(33) }}
  • 14
  • 15
  • 16
  • 17

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

(1) 坐标统计

输入n个整点在平面上的坐标。每个点可以控制所有位于它左下方的点(即x、y坐标都比它小的点),它可以控制的点的数目称为“战斗力”。依次输出每个点的战斗力,最后输出战斗力最高的点的编号(如果若干个点的战斗力并列最高,则输出编号最大的那个)。

#include <iostream>
using namespace std;
const int SIZE = 100;
int x[SIZE], y[SIZE], f[SIZE];
int n,i,j,max_f,ans;
int main() {
    cin >> n;
    for (i=1; i<=n; i++) cin >> x[i] >> y[i];
    max_f = 0;
    for (i=1; i<=n; i++) {
        f[i] = ①;
        for (j=1; j<=n; j++) {
            if (x[j] < x[i] && ②)
                ③;
        }
        if (④) {
            max_f = f[i];
            ⑤;
        }
    }
    for (int i=1; i<=n; i++) cout << f[i] << endl;
    cout << ans << endl;
    return 0;
}
  1. ①处应填( ) {{ select(34) }}
  • 0
  • 1
  • i
  • INT_MAX
  1. ②处应填( ) {{ select(35) }}
  • y[j] <= y[i]
  • y[j] < y[i]
  • y[j] > y[i]
  • y[j] >= y[i]
  1. ③处应填( ) {{ select(36) }}
  • ans = i
  • f[i]++
  • f[i]--
  • ans++
  1. ④处应填( ) {{ select(37) }}
  • (f[i] > max_f)
  • (f[i] >= max_f)
  • (f[i] < max_f)
  • (f[i] <= max_f)
  1. ⑤处应填( ) {{ select(38) }}
  • ans++
  • ans += max_f
  • ans = i
  • ans = max_f

(2) 排列数

输入两个正整数 n,mn, m(1<n<201 < n < 20,1⩽m<n1 \leqslant m < n),在 1∼n1 \sim n 中任取 mm 个数,按字典序从小到大输出所有这样的排列。

样例输入:

3 2

样例输出:

12
13
21
23
31
32
#include <iostream>
#include <cstring>
using namespace std;
const int SIZE=25;
bool used[SIZE];
int data[SIZE];
int n,m,i,j,k;
bool flag;
int main() {
    cin >> n >> m;
    memset(used, false, sizeof(used));
    for (i=1; i<=m; i++) {
        data[i] = i;
        used[i] = true;
    }
    flag = true;
    while (flag) {
        for (i=1; i<=m-1; i++) {
            cout << data[i] << " ";
        }
        cout << data[m] << endl;
        flag = ①;
        for (i=m; i>=1; i--) {
            ②;
            for (j=data[i]+1; j<=n; j++)
                if (!used[j]) {
                    used[j] = true;
                    data[i] = ③;
                    flag = true;
                    break;
                }
            if (flag) {
                for (k=i+1; k<=m; k++)
                    for (j=1; j<=④; j++)
                        if (!used[j]) {
                            data[k] = j;
                            used[j] = true;
                            break;
                        }
                ⑤;
            }
        }
    }
    return 0;
}
  1. ①处应填( ) {{ select(39) }}
  • false
  • true
  • 1
  • -1
  1. ②处应填( ) {{ select(40) }}
  • used[i] = true
  • data[i] = i
  • used[data[i]] = true
  • used[data[i]] = false
  1. ③处应填( ) {{ select(41) }}
  • j
  • i
  • true
  • false
  1. ④处应填( ) {{ select(42) }}
  • n
  • m
  • i
  • j
  1. ⑤处应填( ) {{ select(43) }}
  • return 0
  • exit
  • continue
  • break