GESP认证C++编程真题解析 | 202412 三级
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:GESP认证C++编程真题解析 | 汇总
编程题
B4066 数字替换
【题目来源】
洛谷:B4066 [GESP202412 三级] 数字替换 - 洛谷 (luogu.com.cn)
【题目描述】
小杨有一个包含 \(n\) 个数字的序列 \(A\),即 \(A=[a_1,a_2,...,a_n]\),他想将其中大于 \(k\) 的数字都替换为序列的最大值,将其中小于 \(k\) 的数字都替换为序列的最小值,请你帮他计算出替换后的序列。
【输入】
第一行包含两个正整数 \(n,k\),含义如题面所示。
第二行包含 \(n\) 个数字,代表序列 \(A\)。
【输出】
输出 \(n\) 个整数,代表替换后的结果。
【输入样例】
5 0
-2 -1 0 1 2
【输出样例】
-2 -2 0 2 2
【算法标签】
《洛谷 B4066 数字替换》 #GESP# #2024#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 100005; // 定义常量N,表示数组的最大大小
int n, k; // n: 数组长度,k: 参考值
int a[N]; // a: 存储数组元素
int minn = 1e9, maxn = -1e9; // minn: 数组中的最小值,maxn: 数组中的最大值
int main() {
cin >> n >> k; // 输入数组长度n和参考值k
// 遍历数组,输入元素并计算最小值和最大值
for (int i = 1; i <= n; i++) {
cin >> a[i];
minn = min(minn, a[i]); // 更新最小值
maxn = max(maxn, a[i]); // 更新最大值
}
// 遍历数组,根据参考值k更新数组元素
for (int i = 1; i <= n; i++) {
if (a[i] > k) {
a[i] = maxn; // 如果元素大于k,将其替换为最大值
} else if (a[i] < k) {
a[i] = minn; // 如果元素小于k,将其替换为最小值
}
}
// 输出更新后的数组
for (int i = 1; i <= n; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
【运行结果】
5 0
-2 -1 0 1 2
-2 -2 0 2 2
B4067 打印数字
【题目描述】
洛谷:B4067 [GESP202412 三级] 打印数字 - 洛谷
【题目描述】
小杨为数字 \(0,1,2\) 和 \(3\) 设计了一款表示形式,每个数字占用了 \(5×5\) 的网格。数字 \(0,1,2\) 和 \(3\) 的表示形式如下:
..... ****. ..... .....
.***. ****. ****. ****.
.***. ****. ..... .....
.***. ****. .**** ****.
..... ****. ..... .....
小杨想请你将给定的数字 \(n\) 转换为对应的表示形式。
【输入】
第一行包含一个正整数代表 \(n\)。
【输出】
输出对应的表示形式。
【输入样例】
12230
【输出样例】
****.....................
****.****.****.****..***.
****.................***.
****..****.********..***.
****.....................
【算法标签】
《洛谷 B4067 打印数字》 #GESP# #2024#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n; // 未使用的变量,可以删除
string s[5]; // 存储最终输出的5行字符串
string a[10][5]; // 存储数字0-9的5行点阵表示
string str; // 输入的数字字符串
int main() {
// 初始化数字0的点阵表示
a[0][0] = ".....";
a[0][1] = ".***.";
a[0][2] = ".***.";
a[0][3] = ".***.";
a[0][4] = ".....";
// 初始化数字1的点阵表示
a[1][0] = "****.";
a[1][1] = "****.";
a[1][2] = "****.";
a[1][3] = "****.";
a[1][4] = "****.";
// 初始化数字2的点阵表示
a[2][0] = ".....";
a[2][1] = "****.";
a[2][2] = ".....";
a[2][3] = ".****";
a[2][4] = ".....";
// 初始化数字3的点阵表示
a[3][0] = ".....";
a[3][1] = "****.";
a[3][2] = ".....";
a[3][3] = "****.";
a[3][4] = ".....";
// 读取输入的数字字符串
cin >> str;
// 将每个数字的点阵表示拼接到输出字符串中
for (int i = 0; i < str.size(); i++) {
int t = str[i] - '0'; // 将字符转换为数字
for (int j = 0; j < 5; j++) {
s[j] += a[t][j]; // 将数字t的第j行拼接到输出字符串的第j行
// 注释掉的代码:可以在数字之间添加分隔符
// if (i != str.size() - 1) s[j] += ".";
}
}
// 输出结果
for (int i = 0; i < 5; i++) {
cout << s[i] << endl;
}
return 0;
}
【运行结果】
12230
****.....................
****.****.****.****..***.
****.................***.
****..****.********..***.
****.....................

浙公网安备 33010602011771号