2024年CSP初赛模拟考试·第二套

题目总数:29
总分数:145
时间:不限时
第 1 题    单选题

在 PC 机中,PENTIUM(奔腾)、酷睿、赛扬等是指( ).

A.

生产厂家名称

B.

硬盘的型号

C.

CPU 的型号

D.

显示器的型号

第 2 题    单选题

1TB代表的字节数是( ).

A.

2的10次方

B.

2的20次方

C.

2的30次方

D.

2的40次方

第 3 题    单选题

如果一个栈初始时为空,且当前栈中的元素从栈底到栈顶依次为a,b,c,另有元素d已经出栈,则可能的入栈顺序是

A.

a,d,c,b

B.

b,a,c,d

C.

a,c,b,d

D.

d,a,b,c

第 4 题    单选题

设X、Y、Z分别代表三进制下的一位数字,若等式XY + ZX = XYX在三进制下成立,那么同样在三进制下,等式XY*ZX =()也成立

A.

YXZ

B.

ZXY

C.

XYZ

D.

XZY

第 5 题    单选题

一棵具有5层的满二叉树中结点数为( )。

A.

31

B.

32

C.

33

D.

16

第 6 题    单选题

A.

看题目上选项

B.

看题目上选项

C.

看题目上选项

D.

看题目上选项

第 7 题    单选题

表达式 a*(b+ c)*d的后缀形式是().

A.

abcd*+*

B.

abc+*d*

C.

a*bc+*d

D.

b+c*a*d

第 8 题    单选题

现有一段文言文,要通过二进制哈夫曼编码进行压缩。简单起见,假设这段文言文只由4个汉字“之”、“乎”、“者”、“也”组成,它们出现的次数分别为700、600、300、400。那么,“也”字的编码长度可能是( ).


A.

1

B.

2

C.

3

D.

4

第 9 题    单选题

假设一棵二叉树的后序遍历序列为DGJHEBIFCA,中序通历序列为DBGEHJACIF,则其前序遍历序列为()。

A.

ABCDEFGHIJ

B.

ABDEGHJCFI

C.

ABDEGJHCFI

D.

ABDEGHJFIC

第 10 题    单选题

若有如下程序段,其中 s、a、b、c均已定义为整型变量,且 a、c均已赋值(c大于0)。

5=a;

for(b=1;b<= c; b++ )s=s+1;

则与上述程序段修改s值的功能等价的赋值语句是()。


A.

s=a+b;

B.

s=a+c;

C.

s=s+c;

D.

s=b+c;

第 11 题    单选题

A.

看题目上的选项

B.

看题目上的选项

C.

看题目上的选项

D.

看题目上的选项

第 12 题    单选题

完全二叉树的顺序存储方案,是指将完全二双树的结点从上至下、从左至右依次存放到一个顺序结构的数组中。假定根结点存放在数组的1号位置,则第k号结点的父

结点如果存在的话,应当存放在数组的()号位置。


A.

2k

B.

2k+1

C.

k/2下取整

D.

(k+1)/2下取整

第 13 题    单选题

周末小明和爸爸妈妈三个人一起想动手做三道菜,小明负责洗菜、爸爸负责切菜、妈妈负责炒菜。假设做每道菜的顺序都是:先洗茶10分钟,然后切菜10分钟,最后炒茶10分钟。那么做一道茶需要30分钟。注意:两道不同的茶的相同步骤不可以同时进行。例如第一道茶和第二道的茶不能同时洗,也不能同时切。那么做完三道茶的最短时间需要( )分钟。

A.

90

B.

60

C.

50

D.

40

第 14 题    单选题

有向图中每个顶点的度等于该顶点的( )。

A.

入度

B.

出度

C.

入度和出度之和

D.

入度和出度之差

第 15 题    单选题

A.

看题目选项

B.

看题目选项

C.

看题目选项

D.

看题目选项

第 16-21 题    多题目

1 #include

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的正整数,完成下面的判断题和单选题:

第1题 判断

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

A.
正确
B.
错误

第2题 判断

输出一定大于等于0。

A.
正确
B.
错误

第3题 判断

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

A.
正确
B.
错误

第4题 判断

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

A.
正确
B.
错误

第5题 单选

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

A.

127

B.

126

C.

128

D.

125

第6题 单选

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

A.

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

B.

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

C.

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

D.

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

第 22-27 题    多题目

1 #include <iostream>

2 using namespace std;

3 const int maxn = 10000;

4 int n;

5 int a[maxn];

6 int b[maxn];

7 int f(int l, int r, int depth) {

8 if (l > r)

9 return 0;

10 int min = maxn, mink;

11 for (int i = l; i <= r; ++i) {

12 if (min > a[i]) {

13 min = a[i];

14 mink = i;

15 }

16 }

17 int lres = f(l, mink - 1, depth + 1);

18 int rres = f(mink + 1, r, depth + 1);

19 return lres + rres + depth * b[mink];

20 }

21 int main() {

22 cin >> n;

23 for (int i = 0; i < n; ++i)

24 cin >> a[i];

25 for (int i = 0; i < n; ++i)

26 cin >> b[i];

27 cout << f(0, n - 1, 1) << endl;

28 return 0;

第1题 判断

如果a数组有重复的数字,则程序运行时会发生错误。( )

A.
正确
B.
错误

第2题 判断

如果b数组全为0,则输出为0。

A.
正确
B.
错误

第3题 单选

当n = 100时,最坏情况下,与第12行的比较运算执行的次数最接近的是:()

A.

5000

B.

600

C.

6

D.

100

第4题 单选

当n = 100时,最好情况下,与第12行的比较运算执行的次数最接近的是:()

A.

100

B.

6

C.

5000

D.

600

第5题 单选

当n = 10时,若b数组满足,对任意0 <=讠< n,都有b[i]=i+ 1,那么输出最大为()

A.

386

B.

383

C.

384

D.

385

第6题 单选

当n = 100时,若b数组满足,对任意0 <=讠< n,都有b[i]=1,那么输出最小为()

A.

582

B.

580

C.

579

D.

581

第 28 题    多题目

完善程序:

(读入整数)请完善下面的程序,使得程序能够读入两个int 范围内的整数,并将这两个整数分别输出,每行一个。输入的整数之间和前后只会出现空格或者回车。输入数据保证合法。例如:

输入:

123    -789

输出:

123

-789

#include <iostream>

using namespace std;

int readint(){

int num = 0;       // 存储读取到的整数

int negative = 0;    // 负数标识

char c;               // 存储当前读取到的字符

c = cin.get();

while ((c < '0' || c > '9') && c != '-')

c = ①;

if (c == '-')

negative = 1;

else

②;

c = cin.get();

while (③){

④;

c = cin.get();

}

if (negative == 1)

⑤;

return num;

}

int main()

{

int a, b;

a = readint();

b = readint();

cout << a << endl

<< b << endl;

return 0;

}

第1题 判断

1-5分别填什么?

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

完善程序:

(中位数 median)给定 n(n 为奇数且小于 1000)个整数,整数的范围在 0-m(0< m< 2的31次)之间,请使用二分法求这几个整数的中位数。所谓中位数,是指将这

几 个数排序之后,排在正中间的数。

#include <iostream>

using namespace std;

const int MAXN = 1000;

int n, i, lbound, rbound, mid, m, count;

int x[MAXN];

int main()

{

    cin >> n >> m;

    for (i = 0; i < n; i++)

        cin >> x[i];

    lbound = 0;

    rbound = m;

    while (①)

    {

        mid = (lbound + rbound) / 2;

        ②;

        for (i = 0; i < n; i++)

            if (③)

                ④;

        if (count > n / 2)

            lbound = mid + 1;

        else

            ⑤;

A.

1-5分别填什么?