GESP认证C++编程真题解析 | 202512 三级

编程题

B4449 密码强度

【题目来源】

洛谷:[B4449 GESP202512 三级] 密码强度 - 洛谷

【题目描述】

小杨是学校网络安全小组的成员,今天他的任务是设计一个“密码强度检测器”,帮助同学们检查自己的密码是否足够安全。一个安全的密码需要满足以下条件:

  • 密码至少包含 \(8\) 个字符(太短的密码容易被猜出来哦!)。
  • 密码至少包含一个大写字母(A、B、C、...、Z 都可以)。
  • 密码至少包含一个数字(0、1、2、3、...、9 都可以)。

例如:

  • 密码 Paas1s2an 是安全密码(有 \(8\) 位、包含大写字母 PA 和数字 12)。
  • 密码 ab1da3cd 不是安全密码(没有大写字母)。
  • 密码 Paabdbcd 不是安全密码(没有数字)。
  • 密码 Pa2 不是安全密码(只有 \(3\) 位,太短了)。

【输入】

第一行一个正整数 \(T\),代表需要安全检测的密码组数。

对于每组密码,一行包含一个字符串,代表需要安全检测的密码。

【输出】

对于每组密码,输出一行,如果满足强度要求输出 Y,否则输出 N。

【输入样例】

6
PAs1s2an
1a2bCql3
Pa12bsna
ab1da3cd
Paabdbcd
Pa2

【输出样例】

Y
Y
Y
N
N
N

【算法标签】

《洛谷 B4449 密码强度》 #字符串(入门)# #GESP# #2025#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int t;         // 测试用例的数量
string s;      // 存储输入的字符串

int main()
{
    // 输入测试用例数量
    cin >> t;
    
    // 处理每个测试用例
    while (t--)
    {
        // 输入待检查的字符串
        cin >> s;
        
        // 定义三个标志变量
        bool flag1 = false;  // 标记是否包含大写字母
        bool flag2 = false;  // 标记是否包含数字
        
        // 遍历字符串中的每个字符
        for (int i = 0; i < s.size(); i++)
        {
            // 检查是否包含大写字母 (A-Z)
            if (s[i] >= 'A' && s[i] <= 'Z')
            {
                flag1 = true;
            }
            
            // 检查是否包含数字 (0-9)
            if (s[i] >= '0' && s[i] <= '9')
            {
                flag2 = true;
            }
        }
        
        // 判断密码是否有效
        // 条件1: 长度至少8个字符 (s.size() >= 8)
        // 条件2: 包含至少一个大写字母 (flag1 == true)
        // 条件3: 包含至少一个数字 (flag2 == true)
        if (s.size() >= 8 && flag1 && flag2)
        {
            cout << "Y" << endl;  // 密码有效
        }
        else
        {
            cout << "N" << endl;  // 密码无效
        }
    }
    
    return 0;
}

【运行结果】

6
PAs1s2an
Y
1a2bCql3
Y
Pa12bsna
Y
ab1da3cd
N
Paabdbcd
N
Pa2
N

B4450 小杨的智慧购物

【题目来源】

洛谷:[B4450 GESP202512 三级] 小杨的智慧购物 - 洛谷

【题目描述】

小杨的班级要举办一个环保手工作品展览,老师请小杨去文具店购买 \(M\) 种不同的文具(例如:铅笔、橡皮、尺子等)。

商店里共有 \(N\) 件文具,每件文具都有一个种类编号(从 \(1\)\(M\))和价格。

小杨的预算有限,他想了一个聪明的办法:对于每种文具,他只买最便宜的那一件(如果同种文具有多件价格相同且都是最便宜的,他只会购买其中的一件)。请你帮小杨计算出,买齐这 \(M\) 种文具一共需要花费多少钱。

【输入】

第一行两个正整数 \(M, N\),代表文具的种类数和总数。

之后 \(N\) 行,每行两个正整数 \(K_i\)\(P_i\),分别代表第 \(i\) 件文具的种类编号和它的价格。数据保证每个种类至少有一件文具可供购买。

【输出】

输出一行,代表购买文具的总价。

【输入样例】

2 5
1 1
1 2
1 1
2 3
2 10

【输出样例】

4

【算法标签】

《洛谷 B4450 小杨的智慧购物》 #数组# #GESP# #2025#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 100005;  // 定义最大容量常量
int n, m, k, p;        // 变量声明
vector<int> a[N];      // 数组的向量,用于存储多组数据

int main()
{
    // 输入m和n
    cin >> m >> n;
    
    // 读取n对数据(k, p)
    for (int i = 1; i <= n; i++)
    {
        cin >> k >> p;
        // 将p添加到第k个向量中
        a[k].push_back(p);
    }
    
    // 对每个向量进行排序
    for (int i = 1; i <= m; i++)
    {
        sort(a[i].begin(), a[i].end());
    }
    
    // 计算答案
    int ans = 0;
    for (int i = 1; i <= m; i++)
    {
        // 累加每个向量的第一个元素(最小值)
        ans += a[i][0];
    }
    
    // 输出结果
    cout << ans << endl;
    
    return 0;
}

【运行结果】

2 5
1 1
1 2
1 1
2 3
2 10
4
posted @ 2026-02-24 18:59  团爸讲算法  阅读(333)  评论(0)    收藏  举报