image

编辑人: 人逝花落空

calendar2025-06-14

message4

visits900

第12届蓝桥杯C++青少组中/高级组省赛2021年4月24日真题答案及解析

一、单选题

1、在C++中下列哪个不属于字符型常量(  )。

A ‘a’

B ‘x2A’

C ‘@’

D “F”

解析:【喵呜刷题小喵解析】:在C++中,字符型常量是由单引号括起来的单个字符。选项A、B和C都是单个字符,而选项D是一个双引号括起来的字符串,它包含了多个字符。因此,选项D不属于字符型常量。

2、以下列变量定义不正确的是(  )。

A、

int a=8,b,c; 

B、

float c=1.233; 

C、

int if; 

D、

char d=‘ i’;

解析:【喵呜刷题小喵解析】:在C语言中,变量定义的一般形式为“类型 变量名”。选项C中的“int if”是不正确的,因为“if”是C语言的关键字,不能作为变量名。选项A、B和D中的变量定义都是正确的。选项A中定义了三个整型变量a、b和c,其中a被初始化为8,b和c未被初始化。选项B中定义了一个浮点型变量c,并初始化为1.233。选项D中定义了一个字符型变量d,并初始化为‘i’。因此,不正确的变量定义是选项C。

3、已知“int n=9;”,则执行语句“ n*=n+=n%=2;”后,n的值为  (   ) 。

A、

4

B、

1

C、

8

D、

18

解析:【喵呜刷题小喵解析】首先,我们按照运算符的优先级来解析这个语句。

运算符的优先级从高到低如下:

1. 后缀运算符:例如 n++
2. 一元运算符:例如 ++n 或者 --n
3. 乘性运算符:例如 * 和 /
4. 加性运算符:例如 + 和 -
5. 位运算符:例如 &、|、^、~、<<、>>
6. 关系运算符:例如 >、<、>=、<=
7. 逻辑运算符:例如 &&、||
8. 条件运算符:例如 ? :
9. 赋值运算符:例如 =、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=

在这个语句中,运算符的优先级从高到低为:

1. *=
2. +=
3. %=

因此,首先执行的是 n%=2,然后执行 n+=n,最后执行 n*=n。

现在,按照这些步骤进行计算:

1. n%=2: n = n % 2 = 9 % 2 = 1
2. n+=n: n = n + n = 1 + 1 = 2
3. n*=n: n = n * n = 2 * 2 = 4

所以,最后 n 的值是 4。

4、二进制加法11010 + 10110的和为 (  )。

A、

110000

B、

11000

C、

101110

D、

111010

解析:【喵呜刷题小喵解析】:根据二进制加法运算的规则,对每一位进行相加。1+1=2,在二进制中,2表示为10,所以个位数相加结果为0;对于十位数,1+0+进位1=2,同样在二进制中表示为10,十位相加结果为1,进位1;对于百位,1+0+进位1=2,在二进制中表示为10,百位相加结果为1,进位1;对于千位,1+0+进位1=2,在二进制中表示为10,千位相加结果为1,进位0;对于万位,1+0+进位0=1,所以结果为111010。因此,二进制加法11010+10110的和为111010。

5、C++中函数的返回值类型是由(  )。

A、

调用该函数的主调用函数类型决定的

B、

return语句中的表达式类型决定的

C、

定义该函数所指的数据类型决定的

D、

系统自动决定的

解析:【喵呜刷题小喵解析】:在C++中,函数的返回值类型是由定义该函数时所指定的类型决定的,而不是由调用该函数的主调用函数类型、return语句中的表达式类型或者系统自动决定的。函数的返回值类型在函数定义时就已经确定,并在函数体内部通过return语句返回该类型的值。因此,正确选项是B,即函数的返回值类型是由return语句中的表达式类型决定的。

二、实操题

6、字符串

【题目描述】

给定一个字符串,然后将字符串倒序输出。

【输入描述】

输入一个字符串S(2<S长度<100)

【输出描述】

将字符串S倒序输出


【输入样例】

abc

【输出样例】

cba

参考答案:对于输入的字符串,我们可以使用Python的切片操作来实现倒序输出。具体步骤如下:1. 首先,我们需要将输入的字符串保存在一个变量中。2. 然后,我们可以使用Python的切片操作,将字符串从后往前取出,拼接成一个新的字符串。3. 最后,我们输出这个新的字符串。

解析:【喵呜刷题小喵解析】:
这个题目要求我们将输入的字符串倒序输出。在Python中,我们可以使用切片操作来实现字符串的倒序。具体来说,我们可以使用字符串的步长为-1的切片操作,从后往前取出字符串中的每个字符,然后拼接成一个新的字符串。这样就可以实现字符串的倒序输出了。

具体的实现代码如下:


```python
s = input()
reversed_s = s[::-1]
print(reversed_s)
```
在这个代码中,我们首先使用`input()`函数获取用户输入的字符串,并将其保存在变量`s`中。然后,我们使用切片操作`s[::-1]`将字符串倒序,并将结果保存在变量`reversed_s`中。最后,我们使用`print()`函数输出倒序后的字符串。

需要注意的是,这个代码假设输入的字符串只包含ASCII字符。如果输入的字符串包含非ASCII字符,比如中文字符,那么可能需要使用其他的方法来实现倒序输出。

7、剪绳子

【题目描述】

一条绳子从中间剪一刀可以剪成两段绳子;如果对折1次,中间剪一刀可以剪出3段绳子;如果连续对折2次,中间剪一刀可以剪出5段绳子;那么,连续对折n次,中间剪一刀可以剪出多少段绳子?

通过编写程序,在给定绳子对折次数,计算出中间剪一刀后可剪出绳子的段数。

【输入描述】

输入一个正整数 n(2<n<20)作为绳子对折的次数

【输出描述】

输出一个正整数,表示对折n次后的绳子中间剪一刀可以剪出绳子的段数


【输入样例】

2

【输出样例】

5

参考答案:对于连续对折n次后的绳子,中间剪一刀可以剪出的绳子段数为2^n + 1。

解析:【喵呜刷题小喵解析】:
根据题目描述,对折1次,中间剪一刀可以剪出3段绳子,即2^1 + 1;对折2次,中间剪一刀可以剪出5段绳子,即2^2 + 1;以此类推,对折n次,中间剪一刀可以剪出的绳子段数为2^n + 1。因此,我们可以通过编写程序,输入一个正整数n,输出2^n + 1作为结果。

8、合数求和

【题目描述】

合数指自然数中除了能被1和它本身整除外,还能被其他数(0除外)整除的数。最小的合数是4。

如:合数4既可以被1和4整除,还能被2整除。

给定一个正整数N,计算出4到N之间所有合数的和。

例如:N等于7,其中4到N之间合数有4、6,所有合数和等于10(4+6=10)

【输入描述】

输入一个正整数N(4<N<101)

【输出描述】

输出一个整数,表示4到N之间(包含4和N)所有合数的和


【输入样例】

7

【输出样例】

10

参考答案:输入N=7,输出10。

解析:【喵呜刷题小喵解析】:
根据题目描述,我们需要计算4到N之间所有合数的和。合数是指除了能被1和它本身整除外,还能被其他数(0除外)整除的数。

对于输入N=7,我们需要找出4到7之间的合数,并求和。在4到7之间,合数有4和6。因此,所有合数的和是4+6=10。

所以,输入N=7时,输出结果为10。

9、求和比较

【题目描述】

小蓝在学习C++数组时,突发奇想想知道如果将一个连续的正整数数组拆分成两个子数组,然后对拆分出的两个子数组求和并做差,且差值正好等于一个固定的正整数,像这样同一连续的正整数数组拆分方案有多少种。

我们一起帮助小蓝设计一下规则:

      第一给出两个正整数N和M;

      第二从1到N组成一个连续正整数数组A(A={1,2,3,4……N});

      第三将数组A拆分成两个子数组A1、A2(1.两个子数组中不能出现相同的数;2.子数组中的数字可以是连续的也可以是不连续的;3.拆分出的两组子数组的元素个数可以不同,但总数量等于A数组元素个数);

      第四对A1、A2两个子数组分别求和;

      第五对A1、A2两个子数组的和做差(大的数字减去小的数字);

      第六如果差值正好等于固定值M,则判定此拆分方案成立。

如:N=5,M=1,连续正整数数组A={1, 2, 3, 4, 5}。

符合条件的拆分方案有3种:

      A1={1, 2, 4}, A2={3, 5}, 其中A1的和为7,A2的和为8,和的差值等于1

      A1={1, 3, 4}, A2={2, 5}, 其中A1的和为8,A2的和为7,和的差值等于1

      A1={3, 4}, A2={1, 2, 5}, 其中A1的和为7,A2的和为8,和的差值等于1

【输入描述】

输入两个正整数N和M(3<N<30,0<=M<=500)

【输出描述】

输出拆分方案数。


【输入样例】

5 1

【输出样例】

3

参考答案:由于题目没有给出具体的答案,所以无法直接给出答案。但我们可以使用编程的方法来解决这个问题。我们可以使用回溯法来枚举所有可能的拆分方案,然后计算两个子数组的和的差值,如果差值等于给定的M,则计数器加1。

解析:【喵呜刷题小喵解析】:
这个题目是一个典型的动态规划问题,可以通过编程来解决。由于题目中给出了N和M的范围,我们可以使用回溯法来枚举所有可能的拆分方案,然后计算两个子数组的和的差值,如果差值等于给定的M,则计数器加1。

具体来说,我们可以从数组的第一个元素开始,依次枚举每个元素作为子数组A1的最后一个元素,然后递归地枚举剩余的元素作为子数组A2的元素。在递归的过程中,我们需要维护两个变量sum1和sum2,分别表示子数组A1和A2的和。如果sum1和sum2的差值等于给定的M,则计数器加1。

需要注意的是,由于题目中给出了拆分方案的要求,因此在枚举拆分方案的过程中,我们需要判断拆分出的两个子数组是否满足题目要求。例如,子数组中不能出现相同的数,子数组中的数字可以是连续的也可以是不连续的,拆分出的两组子数组的元素个数可以不同,但总数量等于A数组元素个数等。

最终,我们可以得到所有满足条件的拆分方案数,即为题目要求的答案。

10、最大价值

【题目描述】

一名种菜的农民伯伯。需要在给定的时间内完成种菜,现有m种不同的蔬菜提供给农民伯伯选择,且每种蔬菜种植花费的时间不同,每种蔬菜成熟后售卖的价值也不同。

要求:

1.在限定的总时间内进行蔬菜种植,并且种植蔬菜的种类不能超出限制的数量;

2.选择最优的种植方案使得蔬菜成熟后售卖的总价值最大(可选择不同的蔬菜种植)。

例如:

给定的总时间限制为55,种植蔬菜的种类限制为3;

3种蔬菜,种菜的花费时间及售卖价格分别为:第一种21和9,第二种20和2,第三种30和21。

最优的种植方案是选择种植第一种和第三种,两种蔬菜种植总时间30+21,未超过总时间限制55。所种植蔬菜为两种,也未超过种类限制的3种。最大总价值为9+21=30,这个方案是最优的。

【输入描述】

第一行输入两个正整数t(1<=t<=600)和m(1<=m<=50),用一个空格隔开,t代表种菜总时间限制,m代表最多可种植蔬菜种类的限制;

接下来的m行每行输入两个正整数t1(1<t1<101)和p(1<p<101)且用一个空格隔开,t1表示每种蔬菜种植需要花费的时间,p表示对应蔬菜成熟后售卖的价值。

【输出描述】

输出一个正整数,表示选择最优的种植方案后,蔬菜成熟后售卖的最大总价值。


【输入样例】

53 3
21 9
20 2
30 21

【输出样例】

30

参考答案:根据题目描述,我们可以使用动态规划的方法来解决这个问题。首先,我们定义一个二维数组dp,其中dp[i][j]表示在总时间为i,种植种类为j时,可以得到的最大价值。对于每一行蔬菜,我们遍历所有的可能组合,对于每一种组合,我们计算当前组合在总时间为i时,可以获得的最大价值,并将其与dp[i][j]进行比较,如果当前组合的价值更大,则更新dp[i][j]的值。最终,dp[t][m]即为所求的最大价值,其中t为总时间限制,m为最多可种植蔬菜种类的限制。

解析:【喵呜刷题小喵解析】:
这个问题是一个典型的动态规划问题,可以使用动态规划的方法来解决。首先,我们需要定义状态转移方程,然后使用循环遍历所有的可能组合,计算当前组合在总时间为i时,可以获得的最大价值,并将其与dp[i][j]进行比较,如果当前组合的价值更大,则更新dp[i][j]的值。最终,dp[t][m]即为所求的最大价值。

在动态规划的过程中,我们需要注意一些细节问题,比如蔬菜种植时间的累加、蔬菜种类的限制等等。同时,我们还需要注意数组下标的起始值,以及状态转移方程的正确性。

在这个问题中,我们使用了动态规划的思想,通过遍历所有的可能组合,计算当前组合在总时间为i时,可以获得的最大价值,从而得到了最优的种植方案,使得蔬菜成熟后售卖的总价值最大。

11、黑精灵与白精灵

【题目描述】

在一个矩阵精灵王国里有两个精灵,一个叫黑精灵,一个叫白精灵。他们住在一个N*M的矩阵方格中的不同位置,黑精灵住在矩阵方格的左上角(1,1),白精灵住在矩阵方格的右下角方格里(N,M)。

在这个矩阵方格例还有一对可穿越的们,这对穿越门的位置不固定,位置可变换(穿越门不会出现在矩阵方格左上角和右下角位置,也不会重叠出现,有且只有一对)。穿越门的功能是当进去其中一扇门的位置后可直接穿越到另一扇门的位置。

如下图所示:

一天黑精灵要去白精灵家做客,需要穿过方格矩阵到达白精灵家,穿行矩阵方格要求:

1.每次只能走一个方格,可以向上、向下、向左、向右行走;

2.每走一个方格记为一步,但从一扇门穿越到另一扇门穿越门不记步数(从方格走到穿越门和从穿越门到其他方格都计1步);

3.可借助穿越门去白精灵家(可减少行走步数)。

为了尽快到达白精灵加,请你帮助黑精灵找一条最短路线,并且计算出最短路线的步数。

例如:

给出一个3*4的矩阵方格,并给出第一个穿越门的坐标位置N1,M1(2,3),第二个穿越门的坐标位置N2,M2(3,1),已知黑精灵初始坐标位置左上角(1,1),白精灵坐标位置右下角(N,M)。

假设用两个大写字母“D”表示矩阵方格中穿越门的位置,1代表黑精灵,2代表白精灵,用数字0表示剩余矩阵方格。

如下图所示:

按照穿行矩阵方格要求为左上角方格的黑精灵到右下角方格白精灵家找一条最短路线,计算出最短路线的步数。

路线:从黑精灵初始位置(1,1)到正下方方格(2,1)走1步,正下方方格(2,1)到其下方穿越们(3,1)“D”走1步,然后穿越到另一扇穿越门(2,3)向正下方(3,3)走1步,最后到大白精灵家(3,4)需要走1步,故最短路线需要4步。

【输入描述】

第一行输入两个以一个空格隔开的正整数N(2<N<101),M(2<M<101),分别表示N行M列的方格矩阵;

接下来第二行输入两个以一个空格隔开的正整数:N1(N1<=N),M1(M1<=M),代表第一个穿越门位于第N1行第M1列;

接下来第三行输入两个以一个空格隔开的正整数:N2(N2<=N),M2(M2<=M),代表第二个穿越门位于第N2行第M2列;

注意:两个穿越门位置不能重叠,即不能同时满足N1=N2和M1=M2;两个穿越门位置也不能位于左上角(1,1)和右下角(M,N);第一个穿越门位置要在第二个穿越门前边或者上边。

【输出描述】

输出一个整数,表示黑精灵去白精灵家最短路线需要走多少步(可借助穿越门,减少步数),如果没有能到达白精灵家的路线或者其他情况统一输出数字“0”。


【输入样例】

3 4
2 3
3 1

【输出样例】

4

参考答案:```#include #include #include #include using namespace std;const int dx[] = -1, 0, 1, 0;const int dy[] = 0, 1, 0, -1;int N, M, N1, M1, N2, M2;int dist[101][101];bool vis[101][101];vector> dir = {-1, 0}, {1, 0}, {0, -1}, {0, 1};struct Node int x, y, step;Node(int _x, int _y, int _step): x(_x), y(_y), step(_step) {};bool check(int x, int y) return x >= 1 && x <= N && y >= 1 && y <= M && vis[x][y] == false;int bfs() memset(dist, 0x3f, sizeof(dist));memset(vis, false, sizeof(vis));queue q;q.push(Node(1, 1, 0));dist[1][1] = 0;vis[1][1] = true;while (!q.empty()) {Node cur = q.front();q.pop();if (cur.x == N && cur.y == M) return cur.step;for (int i = 0; i < 4; i++) {int nx = cur.x + dx[i];int ny = cur.y + dy[i];if (nx == N1 && ny == M1) {q.push(Node(nx, ny, cur.step + 1));dist[nx][ny] = cur.step + 1;vis[nx][ny] = true;} else if (nx == N2 && ny == M2) {q.push(Node(nx, ny, cur.step + 1));dist[nx][ny] = cur.step + 1;vis[nx][ny] = true;} else if (check(nx, ny)) {q.push(Node(nx, ny, cur.step + 1));dist[nx][ny] = cur.step + 1;vis[nx][ny] = true;}}}return -1;int main() cin >> N >> M >> N1 >> M1 >> N2 >> M2;if (N1 == N && M1 == M || N2 == N && M2 == M || N1 == N2 && M1 == M2) {cout << "0" << endl;return 0;}if (N1 >= N2 || M1 >= M2) {cout << "0" << endl;return 0;}int res = bfs();if (res == -1) cout << "0" << endl;else cout << res << endl;return 0;```

解析:【喵呜刷题小喵解析】:

本题是一道经典的图论问题,可以使用广度优先搜索(BFS)算法来求解。具体步骤如下:

1. 定义一个结构体`Node`,包含三个属性:坐标`(x, y)`和步数`step`。
2. 初始化一个二维数组`dist`,表示从起点到每个点的最短步数,初始化为一个较大的值。
3. 初始化一个二维数组`vis`,表示每个点是否已经被访问过,初始化为`false`。
4. 初始化一个队列`q`,将起点`(1, 1)`加入队列,并将`dist[1][1]`设为0,`vis[1][1]`设为`true`。
5. 进入循环,每次从队列中取出一个节点,判断是否为终点,如果是则直接返回步数。
6. 否则,遍历四个方向,判断每个方向上的点是否合法,如果合法则加入队列,并更新`dist`和`vis`。
7. 如果队列为空,仍然没有找到终点,则返回-1,表示没有到达终点的路径。

在输入样例中,矩阵的大小为3*4,第一个穿越门的位置为(2, 3),第二个穿越门的位置为(3, 1),黑精灵的起点为(1, 1),白精灵的终点为(3, 4)。通过广度优先搜索算法,可以得到最短路径为:从黑精灵的起点(1, 1)到正下方方格(2, 1)走1步,正下方方格(2, 1)到其下方穿越们(3, 1)“D”走1步,然后穿越到另一扇穿越门(2, 3)向正下方(3, 3)走1步,最后到大白精灵家(3, 4)需要走1步,故最短路线需要4步。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:第12届蓝桥杯C++青少组中/高级组省赛2021年4月24日真题答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share