试卷 CSP初赛模拟考试(第01套)
CSP初赛模拟考试(第01套)
单选题
第 1 题    单选题

以下哪一种设备属于输出设备:( )

A.

扫描仪

B.

键盘

C.

鼠标

D.

打印机

第 2 题    单选题

如果256 种颜色用二进制编码来表示,至少需要(  )位。

A.

6

B.

7

C.

8

D.

9

第 3 题    单选题

对于入栈顺序为a,b,c,d,ea,b,c,d,e的序列,下列(  )不是合法的出栈序列。

A.

a,b,c,d,e

B.

e,d,c,b,a

C.

b,a,c,d,e

D.

c,d,a,e,b

第 4 题    单选题

如果一棵二叉树只有根结点,那么这棵二叉树高度为1。请问高度为5的完全二叉树 有(  )种不同形态?

A.

16

B.

15

C.

17

D.

32

第 5 题    单选题

二进制数 11.01 在十进制下是(  ).

A.

3.25

B.

4.125

C.

6.25

D.

11.125

第 6 题    单选题

下列各无符号十进制整数中,能用八位二进制表示的数中最大的是(  )。

A.

296

B.

133

C.

256

D.

199

第 7 题    单选题

一些数字可以颠倒过来看,例如0、1、8颠倒过来还是本身,6颠倒过来是9, 9颠倒 过来看还是6,其他数字颠倒过来都不构成数字。 类似的,一些多位数也可以颠倒过来看,比如106颠倒过来是901。假设某个城市的车牌只由 5位数字组成,每一位都可以取0到9。 请问这个城市最多有多少个车牌倒过来恰好还是原来的车牌?(  )

A.

60

B.

125

C.

75

D.

100

第 8 题    单选题

二进制数101.11对应的十进制数是(  )。

A.

6.5

B.

5.5

C.

5.75

D.

5.25

第 9 题    单选题

使用冒泡排序对序列进行升序排列,每执行一次交换操作系统将会减少 1 个逆序 对,因此序列 5,4,3,2,1 需要执行( )次操作,才能完成冒泡排序。

A.

0

B.

5

C.

10

D.

15

第 10 题    单选题

由1, 1, 2, 2, 3这五个数字组成不同的三位数有(  )种。

A.

18

B.

15

C.

12

D.

24

第 11 题    单选题

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

A.

B.

C.

D.

第 12 题    单选题

寄存器是(  )的重要组成部分.

A.

硬盘

B.

高速缓存

C.

内存

D.

中央处理器(CPU)

第 13 题    单选题

某算法的计算时间表示为递推关系式 T(n)=T(n-1)+n(n 为正整数)及 T(0)=1,则 该算法的时间复杂度为(   )。

A.

O(logn)

B.

O(nlogn)

C.

O(n)

D.

O(n^2)

第 14 题    单选题

100以内最大的素数是(  ).

A.

89

B.

97

C.

91

D.

93

第 15 题    单选题

冒泡排序算法的伪代码如下:

 输入:数组L, n ≥ k。输出:按非递减顺序排序的 L。

 算法 BubbleSort:

 1. FLAG ← n //标记被交换的最后元素位置

 2. while FLAG > 1 do

 3? k ← FLAG -1

 4? FLAG ← 1

 5? for j=1 to k do

 6. if L(j) > L(j+1) then do

 7? L(j) ? L(j+1)

 8? FLAG ← j

对 n个数用以上冒泡排序算法进行排序,最少需要比较多少次?( )。

A.

n^2

B.

n-2

C.

n-1

D.

n

阅读程序
第 16-21 题    组合题
#include <stdio.h>
#include <string.h>

char base[64];
char table[256];
char str[256];
char ans[256];

void init() {
	for (int i = 0; i < 26; i++) base[i] = 'A' + i;
	for (int i = 0; i < 26; i++) base[26 + i] = 'a' + i;
	for (int i = 0; i < 10; i++) base[52 + i] = '0' + i;
	base[62] = '+', base[63] = '/';

	for (int i = 0; i < 256; i++) table[i] = 0xff;
	for (int i = 0; i < 64; i++) table[base[i]] = i;
	table['='] = 0;
}

void decode(char *str) {
	char *ret = ans;
	int i, len = strlen(str);
	for (i = 0; i < len; i += 4) {
		(*ret++) = table[str[i]] << 2 | table[str[i + 1]] >> 4;
		if (str[i + 2] != '=')
			(*ret++) = (table[str[i + 1]] & 0x0f) << 4 | table[str[i + 2]] >>
			           2;
		if(str[i + 3] != '=')
			(*ret++) = table[str[i + 2]] << 6 | table[str[i + 3]];
	}
}

int main() {
	init();
	printf("%d\n", (int)table[0]);

	scanf("%s", str);
	decode(str);
	printf("%s\n", ans);
	return 0;
}

判断题

1)输出的第二行一定是由小写字母、大写字母、数字和”+”、”/”、”=”构成的字符

串。()

2.)可能存在输入不同,但输出的第二行相同的情形。()

3)输出的第一行为”-1”。()

单选题

4)设输入字符串长度为n,decode函数的时间复杂度为()

5)当输入为”Y3Nx”时,输出的第二行为()

6)当输入为”Y2NmIDIwMjE=”时,输出的第二行为()

1.

A.正确

B.错误

2.

A.正确

B.错误

3.

A.正确

B.错误

4.

A.O(√n)

B.O(n)

C.O(n log n)

D.O(n^2)

5.

A.”csp”

B.“csq”

C.”CSP”

D.“Csp”

6.

A.”ccf2021”

B.”ccf2022”

C.”ccf 2021”

D.”ccf 2022”

第一空(1.5分):___________________________

第二空(1.5分):___________________________

第三空(1.5分):___________________________

第四空(3分):___________________________

第五空(3分):___________________________

第六空(3.5分):___________________________


第 16 题 填空
第 17 题 填空
第 18 题 填空
第 19 题 填空
第 20 题 填空
第 21 题 填空
第 22-27 题    组合题
#include <algorithm>
#include <iostream>
using namespace std;

int n;
int d[50][2];
int ans;

void dfs(int n, int sum) {
	if (n == 1) {
		ans = max(sum, ans);
		return;
	}
	for (int i = 1; i < n; ++i) {
		int a = d[i - 1][0], b = d[i - 1][1];
		int x = d[i][0], y = d[i][1];
		d[i - 1][0] = a + x;
		d[i - 1][1] = b + y;
		for (int j = i; j < n - 1; ++j)
			d[j][0] = d[j + 1][0], d[j][1] = d[j + 1][1];
		int s = a + x + abs(b - y);
		dfs(n - 1, sum + s);
		for (int j = n - 1; j > i; --j)
			d[j][0] = d[j - 1][0], d[j][1] = d[j - 1][1];
		d[i - 1][0] = a, d[i - 1][1] = b;
		d[i][0] = x, d[i][1] = y;
	}
}

int main() {
	cin >> n;
	for (int i = 0; i < n; ++i)
		cin >> d[i][0];
	for (int i = 0; i < n; ++i)
		cin >> d[i][1];
	ans = 0;
	dfs(n, 0);
	cout << ans << endl;
	return 0;
}

假设输入的n是不超过50的正整数,d[i][0]、d[i][i]都是不超过10000的正整数,完成下面

的判断题和单选题:

?判断题

1) 若输入 n 为 0,此程序可能会死循环或发生运行错误。( )

2) 若输入 n 为 20,接下来的输入全为 0,则输出为 0。( )

3) 输出的数一定不小于输入的 d[i][0] 和 d[i][l]的任意一个。( )

?单选题

4) 若输入的 n 为 20,接下来的输入是 20 个 9 和 20 个 0,则输出为( )。

5) 若输入的 n 为 30,接下来的输入是 30 个 0 和 30 个 5,则输出为( )。

6) 若输入的 n 为 15,接下来的输入是 15 到 1,以及 15到1,则输出为( )。

1.

A. 正确

B. 错误

2.

A. 正确

B. 错误

3.

A. 正确

B. 错误

4.

A. 1890

B. 1881

C. 1908

D. 1917

5.

A. 2000

B. 2010

C. 2030

D. 2020

6.

A. 2440

B. 2220

C. 2240

D. 2420

第一空(1.5分):_____________________

第二空(1.5分):_____________________

第三空(1.5分):_____________________

第四空(3分):_____________________

第五空(3分):_____________________

第六空(4分):_____________________

第 22 题 填空
第 23 题 填空
第 24 题 填空
第 25 题 填空
第 26 题 填空
第 27 题 填空
第 28-33 题    组合题
#include<cstdio>
using namespace std;
int n, m;
int a[100], b[100];

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i)
		a[i] = b[i] = 0;
	for (int i = 1; i <= m; ++i) {
		int x, y;
		scanf("%d%d", &x, &y);
		if (a[x] < y && b[y] < x) {
			if (a[x] > 0)
				b[a[x]] = 0;
			if (b[y] > 0)
				a[b[y]] = 0;
			a[x] = y;
			b[y] = x;
		}
	}
	int ans = 0;
	for (int i = 1; i <= n; ++i) {
		if (a[i] == 0)
			++ans;
		if (b[i] == 0)
			++ans;
	}
	printf("%d", ans);
	return 0;
}

假设输入的n和m都是正整数,x和y都是在[1, n]的范围内的整数,完成下面的判断题和单选

题:

?判断题

1)当m>0时,输出的值一定小于2n。()

2)执行完第27行的"++ans"时,ans —定是偶数。()

3)a[i]和b[i]不可能同时大于0。()

4)右程序执行到第13行时,x总是小于y,那么第15行不会被执行。()

?选择题

5)若m个x两两不同,且m个y两两不同,则输出的值为()

6)若m个x两两不同,且m个y都相等,则输出的值为()

1.

A. 正确

B. 错误

2.

A. 正确

B. 错误

3.

A. 正确

B. 错误

4.

A. 正确

B. 错误

5.

A. 2n-2m

B. 2n+2

C. 2n-2

D. 2n

6.

A. 2n-2

B. 2n

C. 2m

D. 2n-2m

第一空(1.5分):____________________

第二空(1.5分):____________________

第三空(1.5分):____________________

第四空(1.5分):____________________

第五空(3分):____________________

第六空(3分):____________________

第 28 题 填空
第 29 题 填空
第 30 题 填空
第 31 题 填空
第 32 题 填空
第 33 题 填空
第 34-38 题    组合题

(矩阵变幻)有一个奇幻的矩阵,在不停的变幻,其变幻方式为:

数字 0 变成矩阵

0 0 

0 1

数字 1 变成矩阵

1 1

1 0

最初该矩阵只有一个元素 0,变幻 nn 次后,矩阵会变成什么样?

例如,矩阵最初为:[0];

矩阵变幻 1 次后:

0 0 

0 1

矩阵变幻 2 次后:

0 0 0 0

0 1 0 1

0 0 1 1

0 1 1 0

输入一行一个不超过 10 的正整数 n。输出变幻 n 次后的矩阵。

试补全程序。

提示:

<<表示二进制左移运算符,例如(11)_2 << 2 = (1100)_2 ;

而 ^ 表示二进制异或运算符,它将两个参与运算的数中的每个对应的二进制位—进行比较,

若两个二进制位相同,则运算结果的对应二进制位为 0 ,反之为 1。

#include <cstdio>
using namespace std;
int n;
const int max_size = 1 << 10;

int res[max_size][max_size];

void recursive(int x, int y, int n, int t) {
if (n == 0) {
res[x][y] = ①;
return;
}
int step = 1 << (n - 1);
recursive(②, n - 1, t);
recursive(x, y + step, n - 1, t);
recursive(x + step, y, n - 1, t);
recursive(③, n - 1, !t);
}

int main() {
scanf("%d", &n);
recursive(0, 0, ④);
int size = ⑤;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
printf("%d", res[i][j]);
puts("");
}
return 0;
}

①处应填()

②处应填()

③处应填()

④处应填()

⑤处应填()

1.

A. n%2

B. 0

C. t

D. 1

2.

A. x-step,y-step

B. x,y-step

C. x-step,y

D. x,y

3.

A. x-step,y-step

B. x+step,y+step

C. x-step,y

D. x,y-step

4.

A. n-1,n%2

B. n,0

C. n,n%2

D. n-1,0

5.

A. 1<<(n+1)

B. 1<<n

C. n+1

D. 1<<(n-1)

第一空(3分):_______________________

第二空(3分):_______________________

第三空(3分):_______________________

第四空(3分):_______________________

第五空(3分):_______________________


第 34 题 填空
第 35 题 填空
第 36 题 填空
第 37 题 填空
第 38 题 填空
第 39-43 题    组合题

(矩形计数)平面上有n个关键点,求有多少个四条边都和x轴或者y轴平行的矩

形,满足四个顶点都是关键点。给出的关键点可能有重复,但完全重合的矩形只计一次。

试补全枚举算法。

#include <stdio.h>

struct point {
int x, y, id;
};

int equals(struct point a, struct point b) {
return a.x == b.x && a.y == b.y;
}

int cmp(struct point a, struct point b) {
return ①;
}

void sort(struct point A[], int n) {
for (int i = 0; i < n; i++)
for (int j = 1; j < n; j++)
if (cmp(A[j], A[j - 1])) {
struct point t = A[j];
A[j] = A[j - 1];
A[j - 1] = t;
}
}

int unique(struct point A[], int n) {
int t = 0;
for (int i = 0; i < n; i++)
if (②)
A[t++] = A[i];
return t;
}

int binary_search(struct point A[], int n, int x, int y) {
struct point p;
p.x = x;
p.y = y;
p.id = n;
int a = 0, b = n - 1;
while(a < b) {
int mid = ③;
if (④)
a = mid + 1;
else
b = mid;
}
return equals(A[a], p);
}

#define MAXN 1000
struct point A[MAXN];

int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &A[i].x, &A[i].y);
A[i].id = i;
}
sort(A, n);
n = unique(A, n);
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if ( ⑤ && binary_search(A, n, A[i].x, A[j].y) && binary_search(A, n,
       A[j].x, A[i].y)) {
ans++;
}
printf("%d\n", ans);
return 0;
}

①处应填()

②处应填()

③处应填()

④处应填()

⑤处应填()

1.

A.a.x != b.x ? a.x < b.x : a.id < b.id

B.a.x != b.x ? a.x < b.x : a.y < b.y

C.equals(a,b) ? a.id < b.id : a.x < b.x

D.equals(a,b) ? a.id < b.id : (a.x != b.x ? a.x < b.x : a.y < b.y)

2.

A.i == 0 || cmp(A[i], A[i - 1])

B.t == 0 || equals(A[i], A[t - 1])

C.i == 0 || !cmp(A[i], A[i - 1])

D.t == 0 || !equals(A[i], A[t - 1])

3.

A.b - (b - a) / 2 + 1

B.(a + b + 1) >> 1

C.(a + b) >> 1

D.a + (b - a + 1) / 2

4.

A.!cmp(A[mid], p)

B.cmp(A[mid], p)

C.cmp(p, A[mid])

D.!cmp(p, A[mid])

5.

A.A[i].x == A[j].x

B.A[i].id < A[j].id

C.A[i].x == A[j].x && A[i].id < A[j].id

D.A[i].x < A[j].x && A[i].y < A[j].y

第一空(3分):_______________________

第二空(3分):_______________________

第三空(3分):_______________________

第四空(3分):_______________________

第五空(3分):_______________________

第 39 题 填空
第 40 题 填空
第 41 题 填空
第 42 题 填空
第 43 题 填空
答题卡
单选题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
阅读程序
题目总数:20
总分数:43
时间:90分钟
QQ
微信