#P1450. 普及组 CSP-J 2026 初赛模拟卷 3

普及组 CSP-J 2026 初赛模拟卷 3

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

第 1 题

在计算机内部,传送、存储和加工处理数据或指令都是以( )形式进行的。

{{ select(1) }}

  • 二进制码
  • 八进制码
  • 十进制码
  • 智能拼音码

第 2 题

计算机的软件系统通常分为( )。

{{ select(2) }}

  • 硬件系统和软件系统
  • 高级软件和一般软件
  • 系统软件和应用软件
  • 军用软件和民用软件

第 3 题

关于五寸软盘读写孔,正确的说法是( )。

{{ select(3) }}

  • 从该孔读信息
  • 从该孔写信息
  • 当该孔处于封住状态时,不能删除盘中文件
  • 该孔没有作用

第 4 题

一棵二树的中序遍历序列为 DGBAECFH,后序遍历序列为 GDBEHFCA,则前序遍历序列为( )。

{{ select(4) }}

  • ABCDFGHE
  • ABDGCEFH
  • ACBGDHEF
  • ACEFHBGD

第 5 题

下列叙述中错误的是( )。

{{ select(5) }}

  • 微机应避免置于强磁场之中
  • 微机使用时间不宜过长,而应隔几小时关机一次
  • 微机应避免频繁开关,以延长其使用寿命
  • 微机不宜长期闲置不用

第 6 题

计算机网络最主要的优点是( )。

{{ select(6) }}

  • 运算速度快
  • 共享资源
  • 精度高
  • 存储容量大

第 7 题

下列 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}

第 8 题

为了区分汉字与 ASCII 码,计算机中汉字编码的最高位为( )。

{{ select(8) }}

  • 1
  • 0
  • −1
  • 2

第 9 题

一般来说,在 TCP/IP 协议簇中 IP 提供的服务属于( )。

{{ select(9) }}

  • 运输层服务
  • 会话层服务
  • 表示层服务
  • 网络层服务

第 10 题

通信时,模拟信号也可以用数字信道来传输,能实现模拟信号与数字信号之间转换功能的是( )。

{{ select(10) }}

  • D/A
  • A/D
  • Modem
  • Codec

第 11 题

一个栈的输入顺序为 1,2,3,4,5,下列序列中可能是栈的输出序列的是( )。

{{ select(11) }}

  • 54312
  • 24135
  • 21543
  • 12534

第 12 题

不属于 Internet 的功能的是( )。

{{ select(12) }}

  • 聊天
  • 远程教育
  • 查询资料
  • 传送能量

第 13 题

下列关于计算机病毒的特性描述中,( )不是正确的。

{{ select(13) }}

  • 潜伏性
  • 传染性
  • 高速性
  • 危害性

第 14 题

下面不属于网络操作系统的是( )。

{{ select(14) }}

  • UNIX
  • Windows NT
  • NetWare
  • DOS

第 15 题

根据《计算机软件保护条例》,中国公民开发的软件享有著作权的情形是( )。

{{ select(15) }}

  • 不论何人、何地及是否发表的软件
  • 只有公开发表的软件
  • 只有单位发表的软件
  • 只有个人在国内公开发表的软件

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 ✓,错误填 ✗;除特殊说明外,判断题每题 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=l; i<=r; i++) a[i] = b[i-l+1];
}
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;
}

判断题

第 16 题

该算法中参数 int *a 采用的不是传值方式。

{{ input(16) }}

第 17 题

该算法输出最后会换行。

{{ input(17) }}

第 18 题

该算法中 mergesort 函数的时间复杂度为 O(nlogn)O(n\log n)

{{ input(18) }}

第 19 题

如果输入为 5 4 3 9 7 8,则输出为 3 4 7 8 9。

{{ input(19) }}

选择题

第 20 题

下列选项中与 i==n ? '\n' : ' ' 功能相同的是( )。

{{ select(20) }}

  • i!=1 ? '\n' : ' '
  • "\n" [i==n]
  • "\n" [i!=n]
  • ' '

第 21 题

该算法在最坏情况下的时间复杂度与( )算法相同。

{{ 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;
}

判断题

第 22 题

该算法中 p1 的作用是确定操作类型。

{{ input(22) }}

第 23 题

去掉 for (i=1; i<=n; i++) f[i] = i; 对该算法没有影响。

{{ input(23) }}

第 24 题

如果输入为 2 2 1 1 2 2 1 2,则输出为 Y。

{{ input(24) }}

第 25 题

如果输入为 2 1 2 1 2,则输出为 N。

{{ input(25) }}

选择题

第 26 题

该算法的时间复杂度为( )。

{{ select(26) }}

  • O(mlogn)O(m\log n)
  • O(nm)O(nm)
  • O(n+m)O(n+m)
  • O(nm2)O(nm^2)

第 27 题

return f[k] = find(f[k]); 改成 return find(f[k]);,则最坏情况下算法的时间复杂度为( )。

{{ select(27) }}

  • O(mlogn)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=1; 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;
}

判断题

第 28 题

main() 函数的 for 循环的作用是求出 nn 的所有因数。

{{ input(28) }}

第 29 题

该程序的作用是对 nn 进行质因数分解。

{{ input(29) }}

第 30 题

去掉 printf("%3d", a[k]); 中的 3 对程序没有影响。

{{ input(30) }}

第 31 题

去掉 if (n % x[k] == 0) 对程序有影响。

{{ input(31) }}

选择题

第 32 题

如果输入为 2,那么输出为( )。

{{ select(32) }}

  • 2
  • 2 1
  • 1 2
  • 2 2

第 33 题

如果输入为 72,那么输出的非回车字符有( )行。

{{ select(33) }}

  • 14
  • 15
  • 16
  • 17

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

(1)

(坐标统计)输入 nn 个整点在平面上的坐标。每个点可以控制所有位于它左下方的点(即 x,yx,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;
}

第 34 题

①处应填( )。

{{ select(34) }}

  • 0
  • 1
  • i
  • INT_MAX

第 35 题

②处应填( )。

{{ select(35) }}

  • y[j]<=y[i]
  • y[j]<y[i]
  • y[j]>y[i]
  • y[j]>=y[i]

第 36 题

③处应填( )。

{{ select(36) }}

  • ans = i
  • f[i]++
  • f[i]--
  • ans++

第 37 题

④处应填( )。

{{ select(37) }}

  • (f[i] > max_f)
  • (f[i] >= max_f)
  • (f[i] < max_f)
  • (f[i] <= max_f)

第 38 题

⑤处应填( )。

{{ select(38) }}

  • ans++
  • ans += max_f
  • ans = i
  • ans = max_f

(2)

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

样例输入:3 2

样例输出:

1 2
1 3
2 1
2 3
3 1
3 2
#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;
}

第 39 题

①处应填( )。

{{ select(39) }}

  • false
  • true
  • 1
  • -1

第 40 题

②处应填( )。

{{ select(40) }}

  • used[j] = true
  • data[j] = i
  • used[data[j]] = true
  • used[data[j]] = false

第 41 题

③处应填( )。

{{ select(41) }}

  • j
  • i
  • true
  • false

第 42 题

④处应填( )。

{{ select(42) }}

  • n
  • m
  • i
  • j

第 43 题

⑤处应填( )。

{{ select(43) }}

  • return 0
  • exit
  • continue
  • break