一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
CSP-J/S第二轮考试测评机所用的 Linux系统属于( )。
UML
IDE
OS
Database
第2题 单选题 (2分)
C++ 中被 static 修饰的变量会存储在( )中。
堆
栈
静态存储区
寄存器
第3题 单选题 (2分)
下列IP中( )属于B类IP。
8.8.8.8
63.31.255.255
173.30.250.1
193.168.110.120
第4题 单选题 (2分)
8 位有符号整型 -97 的补码表示是( )。
00011110
10011111
10011110
11100001
第5题 单选题 (2分)
下列代码中( )无法实现 swap(a, b) ,即两个正整数a、b的交换。
a ^= b ^= a ^= b
a -= b -= a += b
a /= b = (a *= b) / b
t = a, a = b, b = t
第6题 单选题 (2分)
最大长度为30的循环队列中,头指针指向无效元素,尾指针指向有效元素,则当 head = 23 且 tail = 15 时,队列中的元素数为( )。
8
9
22
23
第7题 单选题 (2分)
5 个人排成一排,甲乙相邻,丙丁不相邻的方案数为( )。
24
48
12
60
第8题 单选题 (2分)
10 个人去买价值5元的商品,其中 5 人拿着 5 元,剩下 5 人拿着 10 元,小卖部开始没有钱可以找,有( )种排队方式能使得每个人都找的开。
14
42
24
28
第9题 单选题 (2分)
一棵二叉树的前序遍历结果为 CDBGHAFIE ,中序遍历结果为 BDGHCFAIE ,该二叉树的后序遍历结果是( )。
BHGDFEIAC
CAIEFDGHB
EIFAHGBDC
BGHDFAIEC
第10题 单选题 (2分)
已知2024年8月29日是星期四,则1842年8月29日是( )。
星期一
星期三
星期五
星期日
第11题 单选题 (2分)
某单位安装一条电信宽带进行上网,运营商说下行速度是 1000 Mbps。要下载大小为 20 GB 的软件,最快大约需要( )秒。
2
20
200
2000
第12题 单选题 (2分)
如果字符串s在字符串A中出现了,则字符串s被称作字符串A的子串。设字符串 A = “players”,A的非空子串的数目是( )。
21
22
28
29
第13题 单选题 (2分)
在数组 A[x]中,若存在( i < j )且( A[i] > A[j] ),则称( A[i] , A[j] )为数组 A[x]的一个逆序对。对于序列(7,4,1,9,3,6,8,5),在不改变顺序的情况下,去掉( )会使逆序对的个数减少4。
1
3
6
5
第14题 单选题 (2分)
对数列 {50,40,95,20,15,70,60,45} 以初始增量值 4 进行希尔排序,则第二轮结束后数列的前 4 位为( )。
{15,20,50,40}
{15,40,60,20}
{15,20,40,45}
{15,20,40,50}
第15题 单选题 (2分)
有8个结点的非连通简单无向图最多有( )条边。
8
7
21
49
第16题 判断题 (1.5分)
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填 ×;除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)
(一)
#include<cstdio>
using namespace std;
const int N = 1e3;
int n;
int used[N];
int dfs(int k) {
if (k > n) return 1;
int res = 0;
for (int i = 1; i <= n; ++i) {
if (used[i] && i * i >= i) continue;
used[i] = 1;
res += dfs(k + 1);
used[i] = 0;
}
return res;
}
int main() {
scanf("%d", &n);
printf("%d\n", dfs(1));
return 0;
}
判断题:
当程序输入为 12 时,程序的运行时间可能会超过 1s 。( )
正确
错误
第17题 判断题 (1.5分)
【接上一题】当且仅当输入的 n 满足 n≥3 时,程序的输出结果会大于 n 。( )
正确
错误
第18题 判断题 (1.5分)
【接上一题】将程序第10行中"&& i * i >= i"的内容去掉,程序运行结果可能发生改变。( )
正确
错误
第19题 判断题 (1.5分)
【接上一题】删去程序第 2 行"using namespace std;",程序能成功通过编译。( )
正确
错误
第20题 单选题 (3分)
选择题:
【接上一题】当程序输入为 8 时,程序输出为( )。
15014
1854
133496
40320
第21题 单选题 (3分)
【接上一题】当程序输入为 11 时,程序输出为( )。
176214841
1335972
39916800
1334961
第22题 判断题 (1.5分)
(二)
#include<iostream>
using namespace std;
const int N = 5e3;
int n, m;
int dp[N][N];
int main() {
cin >> n >> m;
dp[0][0] = 1;
for (int i = 1; i <= m; ++i) {
for (int j = 0; j <= n; ++j) {
dp[i][j] = dp[i - 1][j];
if (j >= i) {
dp[i][j] += dp[i][j - i];
}
}
}
cout << dp[m][n] << endl;
return 0;
}
判断题:
程序套用了0/1背包模型。( )
正确
错误
第23题 判断题 (1.5分)
【接上一题】当程序输入为 5000 1000 时,程序有 Runtime error 的风险。( )
正确
错误
第24题 判断题 (1.5分)
【接上一题】当程序第 4 行改为 const int N = 5e6+5; 后,当输入为 1000000 500000 时,程序能在 1s 内正常结束。( )
正确
错误
第25题 判断题 (1.5分)
【接上一题】当程序输入为 0 10 时,程序输出为 0 。( )
正确
错误
第26题 单选题 (3分)
选择题:
【接上一题】当程序输入为 3 0 时,程序输出为( )。
3
1
0
程序无输出
第27题 单选题 (3分)
【接上一题】当程序输入为 10 5 时,程序输出为( )。
42
30
18
0
第28题 判断题 (1.5分)
(三)
#include <iostream>
using namespace std;
int c[100], n, s, cnt, ans;
void calln(int x) {
while (x) {
n++;
x >>= 1;
}
}
int bitcount(int x) {
int cnt = 0;
while (x) {
cnt += x & 1;
x >>= 1;
}
return cnt;
}
int main() {
cin >> s;
calln(s);
for (int i = s; i; i = s & (i-1)) {
cnt++;
c[bitcount(i)] += i;
}
for (int i = 1; i <= n; i++)
ans = max(ans, c[i]);
cout << cnt << endl;
cout << ans << endl;
return 0;
}
假设输入的 s 为正整数且不超过 10
9
,完成下面的判断题和单选题:
判断题:
输出的第一行不会超过输入的 s 。( )
正确
错误
第29题 判断题 (1.5分)
【接上一题】bitcount(x)函数用于计算 x 对应的二进制整数的位数。( )
正确
错误
第30题 判断题 (1.5分)
【接上一题】输入的 s 不应大于 100,否则会发生数组越界。( )
正确
错误
第31题 判断题 (1.5分)
【接上一题】当程序输入为 3 时,程序的输出的第一行和第二行都是 3 。( )
正确
错误
第32题 单选题 (3分)
选择题:
【接上一题】当程序输入的s为 23 时,程序输出的第一行为( )。
3
7
15
31
第33题 单选题 (3分)
【接上一题】当程序输入的s为 11 时,程序输出的第二行为( )。
11
16
19
22
第34题 单选题 (4分)
【接上一题】当程序输入的s为 127 时,程序输出的第二行为( )【本题4分】。
1980
2540
2870
3200
第35题 单选题 (3分)
三、完善程序(单选题,每小题3分,共计30分)
(一) 冒泡排序
题目描述
Mike 有一个数列,他想对这个数列进行排序,但是他只会冒泡排序,于是他想知道,他至少需要交换相邻的数几次,才能将整个数列排成升序呢。
输入格式
第一行一个整数 n ,表示数列的长度。
第二行 n 个整数 a
1
,a
2
,⋯,a
n
,表示数列。
输出格式
一行,包含一个整数,表示最少交换次数。
提示
冒泡排序交换次数即数列逆序对数,此处用归并排序统计逆序对。
数据规模:1≤n≤10
6
,−10
9
≤a
i
≤10
9
。
程序
#include<cstdio>
#include<cstring>
typedef long long LL;
const int N = 1000010;
int n;
LL ans;
int a[N], t[N];
void sort(int l, int r) {
if (l + 1 == r) return;
int mid = l + r >> 1;
___①___;
for (___②___; k < r; ++k)
if (j >= r || (i < mid && a[i] <= a[j])) t[k] = a[i++];
else t[k] = a[j++], ___③___;
___④___;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", a + i);
}
___⑤___;
printf("%lld\n", ans);
return 0;
}
①处应填( )。
sort(l, mid), sort(mid + 1, r)
sort(l, mid), sort(mid, r)
sort(l, mid - 1), sort(mid, r)
sort(l, mid - 1), sort(mid + 1, r)
第36题 单选题 (3分)
【接上一题】②处应填( )。
int k = l, i = l, j = mid +1
int k = l, i = mid + 1, j = l
int k = l, i = mid + 1, j = r
int k = l, i = l, j = mid
第37题 单选题 (3分)
【接上一题】③处应填( )。
++ans
ans += mid - i + 1
ans += mid - i - 1
ans += mid - i
第38题 单选题 (3分)
【接上一题】④处应填( )。
memcpy(a + l, t + l, sizeof(int) * (r - l))
memcpy(a, t, sizeof(a))
memset(t, 0, sizeof(t))
memcpy(a + l, t + l, sizeof(int) * (r - l + 1))
第39题 单选题 (3分)
【接上一题】⑤处应填( )。
sort(1, n)
sort(1, n + 1)
sort(0, n)
sort(0, n + 1)
第40题 单选题 (3分)
(二) 拥挤的城市
题目描述
Tom 所在的城市由 n 个地点组成,并由 n−1 条公路连接,这些公路的分布保证地点之间两两有且仅有一条路径。
Tom 所在的城市十分拥挤,这使 Tom 每次去某地都非常困扰,他为每条公路定义了一个拥挤值,他定义两个地点之间的拥挤程度为两地路径上每条公路的拥挤值的最大值。
现在 Tom 想知道,根据他的定义,任意两两城市间拥挤程度的和是多少呢?
输入格式
第一行一个整数 n ,表示城市中的地点个数。
接下来 n 行每行三个整数 x ,y ,v 表示在地点 x 和 y 之间有一条拥挤值为 v 的公路。
输出格式
一行,包含一个整数,表示任意两两城市间拥挤程度的和。
提示
将边根据拥挤值排序,分别计算每条边对答案的贡献,用并查集维护连通块大小。
数据规模:1≤n≤10
5
,1≤x,y≤n ,1≤v≤10
7
。
程序
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
struct Edge {
int x, y;
LL v;
};
inline bool cmp(Edge A, Edge B) {
return ___①___;
}
int n;
LL ans;
int fa[N], sz[N];
Edge e[N];
int find(int x) {
return fa[x] == x ? x : ___②___;
}
int main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
___③___;
}
for (int i = 1; i < n; ++i) {
cin >> e[i].x >> e[i].y >> e[i].v;
}
sort(e + 1, e + n, cmp);
for (int i = 1; i < n; ++i) {
int x = find(e[i].x), y = find(e[i].y);
ans += ___④___;
fa[x] = y;
___⑤___;
}
cout << ans << endl;
return 0;
}
①处应填( )。
A.x > B.x
A.x < B.x
A.v < B.v
A.v > B.v
第41题 单选题 (3分)
【接上一题】②处应填( )。
find(fa[x])
fa[x] = find(x)
fa[x] = find(fa[x])
x = find(fa[x])
第42题 单选题 (3分)
【接上一题】③处应填( )。
fa[i] = i, sz[i] = 1
fa[i] = sz[i] = 0
fa[i] = 0, sz[i] = 1
fa[i] = 0, sz[i] = i
第43题 单选题 (3分)
【接上一题】④处应填( )。
sz[x] + sz[y]
(sz[x] + sz[y]) * e[i].v
sz[x] * sz[y] * e[i].v
e[i].v * sz[x] * sz[y]
第44题 单选题 (3分)
【接上一题】⑤处应填( )。
sz[x] += sz[y]
fa[y] = x
sz[x] = 0
sz[y] += sz[x]