试卷 CSP 2020 提高级第一轮
CSP 2020 提高级第一轮
单项选择题
第 1 题    单选题

请选出以下最大的数( )

A.

(550)10

B.

(777)8

C.

210

D.

(22F)16

第 2 题    单选题

操作系统的功能是( )

A.

负责外设与主机之间的信息交换

B.

控制和管理计算机系统的各种硬件和软件资源的使用

C.

负责诊断机器的故障

D.

将源程序编译成目标程序

第 3 题    单选题

现有一段8分钟的视频文件,它的播放速度是每秒24 帧图像,每帧图像是一幅分辨 率为2048×1024像素的32位真彩色图像。请问要存储这段原始无压缩视频,需要多大的存 储空间?( )。

A.

30G

B.

90G

C.

150G

D.

450G

第 4 题    单选题

今有一空栈S,对下列待进栈的数据元素序列a, b, c, d, e, f依次进行:进栈,进栈, 出栈,进栈,进栈,出栈的操作,则此操作完成后,栈底元素为( )。

A.

b

B.

a

C.

d

D.

c

第 5 题    单选题

将(2,7,10,18)分别存储到某个地址区间为0~10的哈希表中,如果哈希函数 h(x) =( ),将不会产生冲突,其中 a mod b表示a除以b的余数。

A.

x2 mod 11

B.

2x mod 11

C.

x mod 11

D.

[x/2]mod 11,其中[x/2]表示x/2下取整

第 6 题    单选题

下列哪些问题不能用贪心法精确求解?( )

A.

霍夫曼编码问题

B.

0-1背包问题

C.

最小生成树问题

D.

单源最短路径问题

第 7 题    单选题

具有n 个顶点,e条边的图采用邻接表存储结构,进行深度优先遍历运算的时间复杂 度为( )。

A.

O(n+e)

B.

O(n2)

C.

O(e2)

D.

O(n)

第 8 题    单选题

二分图是指能将顶点划分成两个部分,每一部分内的顶点间没有边相连的简单无向 图。那么,24个顶点的二分图至多有( )条边。

A.

144

B.

100

C.

48

D.

122

第 9 题    单选题

广度优先搜索时,一定需要用到的数据结构是( )。

A.

B.

二叉树

C.

队列

D.

哈希表

第 10 题    单选题

一个班学生分组做游戏,如果每组三人就多两人,每组五人就多三人,每组七人就 多四人,问这个班的学生人数n在以下哪个区间? 已知n<60。( )

A.

30<n<40

B.

40<n<50

C.

50<n<60

D.

20<n<30

第 11 题    单选题

小明想通过走楼梯来锻炼身体,假设从第1层走到第2层消耗10卡热量,接着从第2 层走到第3层消耗20卡热量,再从第3层走到第4层消耗30卡热量,依此类推,从第k层走到 第k+1层消耗10k 卡热量(k > 1)。如果小明想从1层开始,通过连续向上爬楼梯消耗1000卡 热量,至少要爬到第几层楼?( )。

A.

14

B.

16

C.

15

D.

13

第 12 题    单选题

表达式a*(b+c)-d的后缀表达形式为( )。

A.

abc*+d

B.

-+*abcd

C.

abcd*+-

D.

abc+*d

第 13 题    单选题

从一个4×4的棋盘中选取不在同一行也不在同一列上的两个方格,共有( )种方 法。

A.

60

B.

72

C.

86

D.

64

第 14 题    单选题

对一个n个顶点、m条边的带权有向简单图用Dijkstra算法计算单源最短路时,如 果不使用堆或其它优先队列进行优化,则其时间复杂度为( )。

A.

O((m + n2) log n)

B.

O(mn + n3)

C.

O((m + n) log n)

D.

O(n2)

第 15 题    单选题

1948年,( )将热力学中的熵引入信息通信领域,标志着信息论研究的开端。

A.

欧拉(Leonhard Euler)

B.

冯·诺伊曼(John von Neumann)

C.

克劳德·香农(Claude Shannon)

D.

图灵(Alan Turing)

阅读程序
第 16 题    判断题
第16~21题题目
1 #include<iostream>
2 using namespace std;
3
4 int n;
5 int d[1000];
6
7 int main() {
8 cin >> n;
9 for (int i = 0; i < n; ++i)
10 cin >> d[i];
11 int ans = -1;
12 for (int i = 0; i < n; ++i)
13 for (int j = 0; j < n; ++j)
14 if (d[i] < d[j])
15 ans = max(ans, d[i] + d[j] - (d[i] & d[j]));
16 cout << ans;
17 return 0;
18 }

假设输入的n和d[i]都是不超过10000的正整数,完成下面的判断题和单选题:

n必须小于1000,否则程序可能会发生运行错误。()


A.
正确
B.
错误
第 17 题    判断题

输出一定大于等于0。()

A.
正确
B.
错误
第 18 题    判断题

若将第13行的“j = 0”改为“j = i +1”,程序输出可能会改变。()

A.
正确
B.
错误
第 19 题    判断题

将第14行的“d[i] < d[j]”改为“d[i] != d[j]”,程序输出不会改变。()

A.
正确
B.
错误
第 20 题    单选题

若输入n为100,且输出为127,则输入的d[i]中不可能有()。

A.

127

B.

126

C.

128

D.

125

第 21 题    单选题

若输出的数大于0,则下面说法正确的是()。

A.

若输出为偶数,则输入的d[i]中最多有两个偶数

B.

若输出为奇数,则输入的d[i]中至少有两个奇数

C.

若输出为偶数,则输入的d[i]中至少有两个偶数

D.

若输出为奇数,则输入的d[i]中最多有两个奇数

第 22 题    判断题

第22~27题题目

1 #include<iostream>
2 #include
3 using namespace std;
4
5 int n;
6 int d[10000];
7
8 int find(int L, int R, int k) {
9 int x = rand() % (R - L + 1) + L;
10 swap(d[L], d[x]);
11 int a = L + 1, b = R;
12 while (a < b) {
13 while (a < b && d[a] < d[L])
14 ++a;
15 while (a < b && d[b] >= d[L])
16 --b;
17 swap(d[a], d[b]);
18 }
19 if (d[a] < d[L])
20 ++a;
21 if (a - L == k)
22 return d[L];
23 if (a - L < k)
24 return find(a, R, k - (a - L));
25 return find(L + 1, a - 1, k);
26 }
27
28 int main() {
29 int k;
30 cin >> n;
31 cin >> k;
32 for (int i = 0; i < n; ++i)
33 cin >> d[i];
34 cout << find(0, n - 1, k);
35 return 0;
36 }

假设输入的n,k和d[i]都是不超过10000的正整数,且k不超过n,并假设rand()函数产生的

是均匀的随机数,完成下面的判断题和单选题:

第9行的“x”的数值范围是L+1到R,即[L+1, R]。()

A.
正确
B.
错误
第 23 题    判断题

将第19行的“d[a]”改为“d[b]”,程序不会发生运行错误。()

A.
正确
B.
错误
第 24 题    单选题

当输入的d[i]是严格单调递增序列时,第17行的“swap”平均执行次数是()。

A.

O(n log n)

B.

O(n)

C.

O(log n)

D.

O(n2)

第 25 题    单选题

当输入的d[i]是严格单调递减序列时,第17行的“swap”平均执行次数是()

A.

O(n2)

B.

O(n)

C.

O(n log n)

D.

O(log n)

第 26 题    单选题

若输入的d[i]为i,此程序①平均的时间复杂度和②最坏情况下的时间复杂度分别是 ()。

A.

O(n), O(n2)

B.

O(n), O(n log n)

C.

O(n log n), O(n2)

D.

O(n log n), O(n log n)

第 27 题    单选题

若输入的d[i]都为同一个数,此程序平均的时间复杂度是()。

A.

O(n)

B.

O(log n)

C.

O(n log n)

D.

O(n2)

第 28 题    判断题

第28~33题题目

输出可能为0。()

A.
正确
B.
错误
第 29 题    判断题

若输入的两个字符串长度均为101时,则m=0时的输出与m=100时的输出是一样 的。()

A.
正确
B.
错误
第 30 题    判断题

若两个字符串的长度均为n,则最坏情况下,此程序的时间复杂度为O(n!)。()

A.
正确
B.
错误
第 31 题    单选题

若输入的第一个字符串长度由100个不同的字符构成,第二个字符串是第一个字符 串的倒序,输入的m为0,则输出为()。

A.

49

B.

50

C.

100

D.

-1

第 32 题    单选题

已知当输入为“0123\n3210\n1”时输出为4,当输入为 “012345\n543210\n1”时输出为14,当输入为“01234567\n76543210\n1”时输出 为28,则当输入为“0123456789ab\nba9876543210\n1”输出为()。其中“\n”为 换行符。

A.

56

B.

84

C.

102

D.

68

第 33 题    单选题

若两个字符串的长度均为n,且0<m<n-1,且两个字符串的构成相同(即任何一个

字符在两个字符串中出现的次数均相同),则下列说法正确的是()。提示:考虑输入与输

出有多少对字符前后顺序不一样。

A.

若n、m均为奇数,则输出可能小于0。

B.

若n、m均为偶数,则输出可能小于0。

C.

若n为奇数、m为偶数,则输出可能小于0。

D.

若n为偶数、m为奇数,则输出可能小于0。

完善程序
第 34 题    单选题

第34~38题题目

(分数背包)小S有n块蛋糕,编号从1到n。第i块蛋糕的价值是wi,体积是vi。他有一个大

小为B的盒子来装这些蛋糕,也就是说装入盒子的蛋糕的体积总和不能超过B。

他打算选择一些蛋糕装入盒子,他希望盒子里装的蛋糕的价值之和尽量大。

为了使盒子里的蛋糕价值之和更大,他可以任意切割蛋糕。具体来说,他可以选择一个α

(0<α<1),并将一块价值是w,体积为v的蛋糕切割成两块,其中一块的价值是α · w,体积

是α · v,另一块的价值是(1- a)·w,体积是(1-a)·v。他可以重复无限次切割操作。

现要求编程输出最大可能的价值,以分数的形式输出。

比如n=3,B=8,三块蛋糕的价值分别是4、4、2,体积分别是5、3、2。那么最优的方案

就是将体积为5的蛋糕切成两份,一份体积是3,价值是2.4,另一份体积是2,价值是1.6,

然后把体积是3的那部分和后两块蛋糕打包进盒子。最优的价值之和是8.4,故程序输出

42/5。

输入的数据范围为:1≤n≤1000,1≤B≤105;1≤wi,vi≤100。提示:将所有的蛋糕按照性

价比wi/vi从大到小排序后进行贪心选择。试补全程序。

①处应填()


A.

w[j] / v[i] < w[j +1] / v[j +1]

B.

w[j] / v[j] > w[j +1] / v[j+ 1]

C.

v[j] * w[j + 1] < v[j + 1]* w[j]

D.

w[j]* v[j + 1] < w[j +1]* v[j]

第 35 题    单选题

②处应填()

A.

w[1] <= B

B.

v[1] <= B

C.

w[1] >= B

D.

v[1] >= B

第 36 题    单选题

③处应填()

A.

print(v[1], w[1]); return 0;

B.

curV = 0; curW = 0;

C.

print(w[1], v[1]); return 0;

D.

curV = v[1]; curW = w[1];

第 37 题    单选题

④处应填()

A.

curW * v[i] + curV * w[i], v[i]

B.

(curW - w[i]) * v[i] + (B - curV) * w[i], v[i]

C.

curW + v[i], w[i]

D.

curW * v[i] + (B - curV) * w[i], v[i]

第 38 题    单选题

⑤处应填()

A.

curW, curV

B.

curW, 1

C.

curV, curW

D.

curV,1

第 39 题    单选题

第39~43题题目

(最优子序列)取m = 16,给出长度为n的整数序列a1, a2,…, an(0≤ ai <2m)。对于一个二进制数x,定义其分值w(x)为x+ popcnt(x),其中popcnt(x)表示x二进制表示中1的个数。对于一个子序列b1, b2…, bk,定义其子序列分值S为w(b1 ⊕ b2) + w(b2 ⊕b3)+w(b3 ⊕ b4)+…+w(bk-1 ⊕ bk)。其中⊕表示按位异或。对于空子序列,规定其子序

列分值为0。求一个子序列使得其子序列分值最大,输出这个最大值。输入第一行包含一个整数n(1 ≤n ≤ 40000)。接下来一行包含n个整数a1, a2,…, an。

提示:考虑优化朴素的动态规划算法,将前m/2位和后m/2位分开计算。Max[x][y]表示当前的子序列下一个位置的高8位是x、最后一个位置的低8位是y时的最大价值。

试补全程序。

#include<iostream>

using namespace std;

typedef long long LL;

const int MAXN = 40000, M = 16, B = M >> 1, MS = (1 << B) - 1;
const LL INF = 1000000000000000LL;
LL Max[MS + 4][MS + 4];

int w(int x) {
	int s = x;
	while(x) {
		①;
		s++;
	}
	return s;
}

void to_max(LL &x, LL y) {
	if(x < y)
		x = y;
}

int main() {
	int n;
	LL ans = 0;
	cin >> n;
	for(int x = 0; x <= MS; x++)
		for(int y = 0; y <= MS; y++)
			Max[x][y] = -INF;
	for(int i = 1; i <= n ; i++) {
		LL a;
		cin >> a;
		int x = ② , y = a & MS;
		LL v = ③;
		for(int z = 0; z < = MS; z++)
			to_max(v, ④);
		for(int z = 0; z < = MS; z++)
			⑤;
		to_max(ans , v);
	}
	cout << ans << endl;
	return 0;
}

①处应填()


A.

x >>= 1

B.

x ^= x & (x ^ (x + 1))

C.

x -= x | -x

D.

x ^= x & (x ^ (x - 1))

第 40 题    单选题

②处应填()

A.

(a & MS) << B

B.

a >> B

C.

a & (1 << B)

D.

a & (MS << B)

第 41 题    单选题

③处应填()

A.

-INF

B.

Max[y][x]

C.

0

D.

Max[x][y]

第 42 题    单选题

④处应填()

A.

Max[x][z] + w(y ^ z)

B.

Max[x][z] + w(a ^ z)

C.

Max[x][z] + w(x ^ (z <<B))

D.

Max[x][z] + w(x^ z)

第 43 题    单选题

⑤处应填()

A.

to_max(Max[y][z], v + w(a ^ (z << B)))

B.

to_max(Max[z][y], v + w((x^ z) << B))

C.

to_max(Max[z][y], v + w(a ^ (z << B)))

D.

to_max(Max[x][z], v + w(y ^ z))

答题卡
单项选择题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
阅读程序
完善程序
题目总数:43
总分数:100
时间:120分钟
QQ
微信