GESP认证C++编程真题解析 | 202512 三级
编程题
B4449 密码强度
【题目来源】
洛谷:[B4449 GESP202512 三级] 密码强度 - 洛谷
【题目描述】
小杨是学校网络安全小组的成员,今天他的任务是设计一个“密码强度检测器”,帮助同学们检查自己的密码是否足够安全。一个安全的密码需要满足以下条件:
- 密码至少包含 \(8\) 个字符(太短的密码容易被猜出来哦!)。
- 密码至少包含一个大写字母(A、B、C、...、Z 都可以)。
- 密码至少包含一个数字(0、1、2、3、...、9 都可以)。
例如:
- 密码
Paas1s2an是安全密码(有 \(8\) 位、包含大写字母P、A和数字1、2)。 - 密码
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
浙公网安备 33010602011771号