1

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
posted @ 2026-01-19 16:55  热爱编程的通信人  阅读(1)  评论(0)    收藏  举报