image

编辑人: 沉寂于曾经

calendar2025-08-04

message9

visits360

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

一、单选题

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

A ‘a’

B ‘x2A’

C ‘@’

D “F”


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

A、

int a=8,b,c; 

B、

float c=1.233; 

C、

int if; 

D、

char d=‘ i’;


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

A、

4

B、

1

C、

8

D、

18


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

A、

110000

B、

11000

C、

101110

D、

111010


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

A、

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

B、

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

C、

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

D、

系统自动决定的


二、实操题

6、字符串

【题目描述】

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

【输入描述】

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

【输出描述】

将字符串S倒序输出


【输入样例】

abc

【输出样例】

cba

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


7、剪绳子

【题目描述】

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

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

【输入描述】

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

【输出描述】

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


【输入样例】

2

【输出样例】

5

参考答案:对于连续对折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。


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。


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为最多可种植蔬菜种类的限制。


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;```


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

创作类型:
原创

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

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