GESP认证C++编程真题解析 | 202403 四级
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:GESP认证C++编程真题解析 | 汇总
编程题
B3958 相似字符串
【题目来源】
洛谷:B3958 [GESP202403 四级] 相似字符串 - 洛谷
【题目描述】
对于两个字符串 \(A\) 和 \(B\),如果 \(A\) 可以通过删除一个字符,或插入一个字符,或修改一个字符变成 \(B\),那么我们说 \(A\) 和 \(B\) 是相似的。
比如 apple 可以通过插入一个字符变成 applee ,可以通过删除一个字符变成 appe ,也可以通过修改一个字符 变成 bpple ,因此 apple 和 applee 、 appe 、 bpple 都是相似的。但 applee 并不能通过任意一个操作变成 bpple ,因此它们并不相似。
特别地,完全相同的两个字符串也是相似的。
给定 \(T\) 组 \(A,B\),请你分别判断他们是否相似。
【输入】
第一行一个正整数 \(T\)。
接下来 \(T\) 行,每行两个用空格隔开的字符串 \(A\) 和 \(B\)。
保证 \(T\le 100\),\(A,B\) 的长度不超过 \(50\)。保证 \(A\) 和 \(B\) 只包含小写字母。
【输出】
输出 \(T\) 行,对于每组 \(A,B\),如果它们相似,则输出 similar,否则输出 not similar 。
【输入样例】
5
apple applee
apple appe
apple bpple
applee bpple
apple apple
【输出样例】
similar
similar
similar
not similar
similar
【算法标签】
《洛谷 B3958 相似字符串》 #字符串(入门)# #GESP# #2024#
【代码详解】
#include <bits/stdc++.h> // 包含所有标准库头文件
using namespace std; // 使用标准命名空间
// 判断两个字符串是否相似
bool isSimilar(string A, string B) {
int m = A.size(), n = B.size();
// 长度差超过1直接返回不相似
if (abs(m - n) > 1) return false;
// 情况1:长度相等(可能只需要修改一个字符)
if (m == n) {
int diff = 0; // 记录不同字符的数量
for (int i = 0; i < m; i++) {
if (A[i] != B[i]) {
diff++;
if (diff > 1) return false; // 超过1处不同
}
}
return true; // 0或1处不同
}
// 情况2:长度差1(可能需要插入/删除一个字符)
else {
string& shorter = (m < n) ? A : B; // 较短的字符串
string& longer = (m < n) ? B : A; // 较长的字符串
int i = 0, j = 0; // 双指针
int diff = 0; // 差异计数器
while (i < shorter.size() && j < longer.size()) {
if (shorter[i] != longer[j]) {
diff++;
if (diff > 1) return false; // 超过1处差异
++j; // 只移动较长字符串的指针(模拟插入/删除)
} else {
++i;
++j;
}
}
return true; // 最多1处差异
}
}
int main() {
int T; // 测试用例数量
cin >> T;
while (T--) {
string A, B;
cin >> A >> B; // 输入两个字符串
if (isSimilar(A, B)) {
cout << "similar" << endl;
} else {
cout << "not similar" << endl;
}
}
return 0;
}
【运行结果】
5
apple applee
similar
apple appe
similar
apple bpple
similar
applee bpple
not similar
apple apple
similar
B3959 做题
【题目来源】
洛谷:B3959 [GESP202403 四级] 做题 - 洛谷
【题目描述】
小杨同学为了提高自己的实力制定了做题计划,在第 天时,他必须要完成 道题,否则他就会偷懒。
小杨同学现在找到了一个题库,一共有 \(n\) 套题单,每一套题单中有一定数量的题目。但是他十分挑剔,每套题单他只会使用一次,每一天也只能使用一套题单里的题目,之后那套题单就会被弃之不用。对于每套题单,他不必完成 题单内所有的题。
那么问题来了,小杨同学最多会做题几天才偷懒呢?
【输入】
第一行,\(1\) 个数为 \(n\),表示有多少套题单。
第二行,\(n\) 个整数 \(a_1,a_2,\dots, a_n\),分别表示每套题单有多少道题。
【输出】
输出一行,小杨同学偷懒前最多做题天数。
【输入样例】
4
3 1 4 1
【输出样例】
3
【算法标签】
《洛谷 B3959 做题》 #贪心# #排序# #GESP# #2024#
【代码详解】
#include <bits/stdc++.h> // 包含所有标准库头文件
using namespace std;
long long a[1000005]; // 定义全局数组存储数据
int main() {
int n;
cin >> n; // 输入数据数量
// 读取n个数据
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a + 1, a + n + 1); // 对数组进行升序排序
int start = 1; // 搜索起始位置
int ans = 0; // 最终答案
// 计算最大满足天数
for (int i = 1; i <= n; i++) { // i表示当前检查的天数
for (int j = start; j <= n; j++) { // 从start开始查找
if (i <= a[j]) { // 找到第一个满足a[j]≥i的位置
ans = i; // 更新最大天数
start = j + 1; // 下次从下一个位置开始查找
break; // 跳出内层循环
}
}
}
cout << ans; // 输出结果
return 0;
}
【运行结果】
4
3 1 4 1
3

浙公网安备 33010602011771号