c++蓝桥杯12届解析

选择题
第⼀题(单选题)  
下列符号中哪个在 C++ 中表⽰⾏注释 ()
A. !
B. #
C. ]
D. //
解析 D
C++ 注释的编写⽅法如下:
/* (斜线、星号)字符,后跟任意字符序列(包括新⾏),然后是 */ 字符。 此语法与 ANSI C 相同。
// (两个斜杠)字符,后跟任意字符序列。 没有紧跟反斜杠的新⾏将终⽌这种形式的注释。 因此,它通
常称为 单⾏注释
第⼆题(单选题)
每个 C++ 程序都必须有且仅有⼀个 ()
A. 函数
B. 预处理命令
C. 主函数
D. 语句
解析: C
C++ 中主函数只有⼀个。
第三题(单选题)
下列字特串中不可以⽤作 C++ 变量名称的是 ( )
A. str123
B. int
C._9999
D.name
解析: B
以下为 C++ 必须遵守的变量命名规则: 12 届蓝桥杯省赛解析 .md
3/9/2023
2 / 7
1 变量名只能是字⺟( A-Z a-z )和数字( 0-9 )或者下划线( _ )组成。
2 第⼀个字⺟必须是字⺟或者下划线开头。
3 不能使⽤ C++ 关键字来命名变量,以免冲突。
4 变量名区分⼤⼩写。
第四题(单选题)
⼆进制加法 10010100+110010 的和为 ( )
A. 11000110
B. 10100110
C. 10110110
D. 11100110
解析: A
⼆进制数的加法根据 逢⼆进⼀ 规则,
⼆进制数加法的法则为:
0 0 0
0 1 1
1 0 1
1 1 10 (进位为 1
第五题(单选题)
对于 int *pa[5]; 的描述中,正确的是 () 12 届蓝桥杯省赛解析 .md
3/9/2023
3 / 7
A.pa 是⼀个指向数组的指针,所指向的数组是 5 int 型元素
B.pa 是⼀个指向某数组中第 5 个元素的指针,该元素是 int 型变量
C.pa[5] 表⽰数组的第 5 个元素的值,是 int 型的值
D.pa 是⼀个具有 5 个元素的指针数组,每个元素是⼀个 int 型指针
解析: D
int *pa[5]: 定义了⼀个名为 pa 的数组,该数组有 5 个元素,每个元素都是⼀个指针,指针指向整形变量。
编程题
1 字符串

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

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

将字符串S倒序输出。

输入数据 1

abc

Copy

输出数据 1

cba
【解析】本题考查的是字符串的基本知识。
#include <iostream>
#include <string>
using namespace std ;
int main ()
{
string s;
cin >> s;
for ( int i = s.length() -1 ; i >= 0 ; i--)
{
cout << s[i];
}
cout << endl ;
return 0 ;
}
2 、剪绳⼦

题目描述

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

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

输入格式

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

输出格式

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

输入数据 1

2

Copy

输出数据 1

5
【解析】
编程计算即可
#include <iostream>
using namespace std ;
int main ()
{
int n;
cin >> n;
int ans = 1 ;
for ( int i = 1 ; i <= n; i++)
{
ans *= 2 ;
}
ans += 1 ;
cout << ans << endl ;
return 0 ;
}
3 、合数求和
【解析】
本题考查质合判断,枚举 4~n 中所有的合数,求和即可。
#include <iostream>
using namespace std ;
// 求质数
bool isPrime ( int x)
{
if (x < 2 ) return false ;
for ( int i = 2 ; i * i <= x; i++)
{
if (x % i == 0 ) return false ;
}
return true ;
}
int main ()
{
int n;
cin >> n;
int sum = 0 ;
for ( int i = 4 ; i <= n; i++)
{
if (!isPrime(i)) // 如果是质数,累加到 sum
{
sum += i;
}
cout << sum << endl ;
return 0 ;
}
4 、求和比较
【解析】
本题属于计数型动态规划问题,我们可以定义出状态 dp[i][j] 表⽰ 1~i 的数字拆分成两个⼦数组求和的差的绝对值
j 的⽅案数。
答案需要特判 m == 0 时的情况,例如 n=3, m=0 时,只有⼀组 A1={1, 2}, A2={3} ,但使⽤ dp 会将正反计算两次,
因此需要对结果除以 2
其他情况下,不会出现正反计算两次的情况,因此直接输出即可。
#include <iostream>
#include <algorithm>
using namespace std ;
int dp[ 35 ][ 550 ];
int main ()
{
int n, m;
cin >> n >> m;
int sum = 0 ;
dp[ 0 ][ 0 ] = 1 ;
for ( int i = 1 ; i <= n; i++)
{
for ( int j = 0 ; j <= (i+ 1 )*i/ 2 ; j++)
{
//dp[i][j] 表⽰ 1~i 的数字拆分成两个⼦数组求和的差的绝对值为 j 的⽅案数。
dp[i][j] = dp[i -1 ][j+i] + dp[i -1 ][ abs (j-i)];
}
}
if (m == 0 )
cout << dp[n][m] / 2 << endl ;
else
cout << dp[n][m] << endl ;
return 0 ;
5 、最⼤价值
【解析】
本题为 01 背包问题,属于模板题。
#include <iostream>
#include <algorithm>
using namespace std ;
int w[ 55 ], v[ 55 ];
int dp[ 55 ][ 605 ];
int main ()
{
int t, m;
cin >> t >> m;
for ( int i = 1 ; i <= m; i++)
{
cin >> w[i] >> v[i];
for ( int i = 1 ; i <= m; i++)
{
for ( int j = 1 ; j <= t; j++)
{
if (j >= w[i])
dp[i][j] = max (dp[i -1 ][j], dp[i -1 ][j-w[i]]+v[i]);
else
dp[i][j] = dp[i -1 ][j];
}
}
cout << dp[m][t] << endl ;
return 0 ;
}
  • 25
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值