涉及考试:计算机学会编程能力等级认证(GESP) 活动内容:提供不同等级的真题供小朋友们选择练习 备考建议:根据自己备考的等级选择相应题目 附加价值:可作为白名单比赛的备考训练 本月打卡:本月打卡题目
【提交】
https://www.luogu.com.cn/problem/B4034
【问题描述】
小杨有 元钱用于购物。商品 的单价是 元,商品 的单价是 元。小杨想购买 相同数量 的商品 和商品 。
请你编写程序帮小杨计算出他最多能够购买多少个商品 和商品 。
【输入描述】
第一行包含一个正整数 ,代表小杨用于购物的钱的金额。
第二行包含一个正整数 ,代表商品 的单价。
第三行包含一个正整数 ,代表商品 的单价。
【输出描述】
输出一行,包含一个整数,代表小杨最多能够购买的商品 和商品 的数量。
【样例输入1】
1212【样例输出1】
4【提示】
对于样例1,由于需要购买相同数量的两种商品,因此小杨最多能够购买 件商品 和 件商品 ,共花费 元。因此,样例1的答案为 。
【样例输入2】
1312【样例输出1】
4【提示】
对于样例2,由于需要购买相同数量的两种商品,因此小杨最多能够购买 件商品 和 件商品 ,共花费 元。如果小杨想购买 件商品 和 件商品 ,则需花费 元,超过了小杨的预算 元。因此,样例2的答案为 。
对于全部数据,保证有 。
参考答案:
/** GESP一级2024.09_小杨购物* https://www.luogu.com.cn/problem/B4034*/#include<iostream>usingnamespacestd;intmain(){int n, a, b;cin >> n >> a >> b;cout << n / (a + b) << "\n";return0;}【提交】
http://noi.openjudge.cn/ch0105/43/
【描述】
已知正整数 是两个不同的质数的乘积,试求出较大的那个质数。
【输入】
输入只有一行,包含一个正整数 。
【输出】
输出只有一行,包含一个正整数 ,即较大的那个质数。
【样例输入】
21【样例输出】
7【来源】
NOIP2012复赛 普及组 第一题
【参考程序】
C语言版本
/** # 43:质因数分解* http://noi.openjudge.cn/ch0105/43/*/#include<cmath>#include<cstdio>intmain(){int n;scanf("%d", &n);for (int i = 2; i <= sqrt(n); i++) {if (n % i == 0) {printf("%d", n / i);break; } }return 0;}C++版本
/** # 43:质因数分解* http://noi.openjudge.cn/ch0105/43/*/#include<cmath>#include<iostream>using namespace std;intmain(){int n;cin >> n;for (int i = 2; i <=sqrt(n); i++) {if (n % i == 0) {cout << n / i;break; } }return 0;}【提交】
http://noi.openjudge.cn/ch0107/04/
【描述】
石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时用于“意外”与“技术”两种特性,深受世界人民喜爱。
游戏规则:石头打剪刀,布包石头,剪刀剪布。
现在,需要你写一个程序来判断石头剪子布游戏的结果。
【输入】
输入包括行:
第一行是一个整数,表示一共进行了次游戏。。
接下来行的每一行包括两个字符串,表示游戏参与者Player1,Player2的选择(石头、剪子或者是布):字符串之间以空格隔开,只可能取值在{"Rock", "Scissors", "Paper"}(大小写敏感)中。
【输出】
输出包括行,每一行对应一个胜利者(Player1或者Player2),或者游戏出现平局,则输出Tie。
【样例输入】
3Rock ScissorsPaper PaperRock Paper【样例输出】
Player1TiePlayer2【提示】
Rock是石头,Scissors是剪刀,Paper是布。
【参考程序】
C++版本
/** 04:石头剪子布* http://noi.openjudge.cn/ch0107/04/*/#include<iostream>#include<string>using namespace std;intmain(){int n;string s1, s2;cin >> n;for (int i = 0; i < n; i++) {cin >> s1 >> s2;if (s1 == "Rock") {if (s2 == "Rock") {cout << "Tie" << endl; }else if (s2 == "Scissors") {cout << "Player1" << endl; }else {cout << "Player2" << endl; } }else if (s1 == "Scissors") {if (s2 == "Rock") {cout << "Player2" << endl; }else if (s2 == "Scissors") {cout << "Tie" << endl; }else {cout << "Player1" << endl; } }else {if (s2 == "Rock") {cout << "Player1" << endl; }else if (s2 == "Scissors") {cout << "Player2" << endl; }else {cout << "Tie" << endl; } } }return 0;}【提交】
https://www.luogu.com.cn/problem/B4360
【问题描述】
小 A 在高为 宽为 的矩形画布上绘制了一幅画。由于画布边缘留白太多,小 A 想适当地裁剪画布,只保留画的主体。具体来说,画布可以视为 行 列的字符矩阵,其中的字符均为 ASCII 码位于 之间的可见字符,小 A 只保留画布中由第 行到第 行、第 列到第 列构成的子矩阵。
小 A 将画布交给了你,你能帮他完成画布的裁剪吗?
【输入描述】
第一行,两个正整数 ,分别表示画布的行数与列数。
第二行,四个正整数 ,表示保留的行列边界。
接下来 行,每行一个长度为 的字符串,表示画布内容。
【输出描述】
输出共 行,每行一个长度为 的字符串,表示裁剪后的画布。
【样例输入1】
3 52 2 2 4......>_<......【样例输出1】
>_<【样例输入2】
5 51 2 3 4AbCdEfGhIkLmNoPqRsTuVwXyZ【样例输出2】
CdhI【数据范围】
对于所有测试点,保证 ,,。
参考答案:
/** [GESP202506 四级] 画布裁剪* https://www.luogu.com.cn/problem/B4360*/#include<iostream>using namespace std;char arr[105][105];intmain(){int h, w;cin >> h >> w;int x1, x2, y1, y2;cin >> x1 >> x2 >> y1 >> y2;for (int i = 1;i <= h;i++) {for (int j = 1;j <= w;j++) {cin >> arr[i][j]; } }for (int x = x1;x <= x2;x++) {for (int y = y1;y <= y2;y++) {cout << arr[x][y]; }cout << endl; }return 0;}【提交】
https://www.luogu.com.cn/problem/B3871
【问题描述】
每个正整数都可以分解成素数的乘积,例如:、。
现在,给定一个正整数 ,请按要求输出它的因数分解式。
【输入描述】
输入第一行,包含一个正整数 。约定
【输出描述】
输出一行,为 的因数分解式。要求按质因数由小到大排列,乘号用星号*表示,且左右各空一格。当且仅当一个素数出现多次时,将它们合并为指数形式,用上箭头^表示,且左右不空格。
【样例输入1】
6【样例输出1】
2 * 3【样例输入2】
20【样例输出2】
2^2 * 5【样例输入3】
23【样例输出3】
23参考答案:
/** [GESP202309 五级] 因数分解* https://www.luogu.com.cn/problem/B3871*/# include<iostream># include<vector>using namespace std;intmain(){long long N;cin >> N;bool first = true;for (long long p = 2;p * p <= N;p++) {if (N % p != 0)continue;int cnt = 0;while (N % p == 0) { cnt += 1; N /= p; }if (first) { first = false; }else {cout << " * "; }cout << p;if (cnt > 1) {cout << "^" << cnt; } }if (N > 1) {if (first) { first = false; }else {cout << " * "; }cout << N; }return 0;}【提交】
https://www.luogu.com.cn/problem/P10721
【问题描述】
小杨想要计算由 个小写字母组成的字符串的得分。
小杨设置了一个包含 个正整数的计分序列 ,如果字符串的一个子串由 个 首尾相接组成,那么能够得到分数 ,并且字符串包含的字符不能够重复计算得分,整个字符串的得分是计分子串的总和。
例如,假设 ,字符串 的所有可能计分方式如下:
小杨想知道对于给定的字符串,最大总得分是多少。
【输入描述】
【输出描述】
输出一个整数,代表给定字符串的最大总得分。
【样例输入1】
33 1 213dabcabcabcabz【样例输出1】
9【样例解释】
最优的计分方式为 ,总得分为 ,共 分。
【数据范围】

对于全部数据,保证有 ,,。
参考答案:
/** [GESP202406 六级] 计算得分* https://www.luogu.com.cn/problem/P10721*/#include<iostream>#include<vector>#include<string>#include<algorithm>using namespace std;// 检查从位置start开始的连续k个"abc"是否有效boolisValidABC(conststring& s, int start, int k){for (int j = 0; j < k; ++j) {int pos = start + 3 * j;if (s.substr(pos, 3) != "abc") {return false; } }return true;}intmain(){// 输入处理int n; // 计分序列长度cin >> n;vector<int> a(n + 1); // 计分序列,a[1]到a[n]for (int i = 1; i <= n; ++i) {cin >> a[i]; }int m; // 字符串长度cin >> m;string s; // 输入字符串cin >> s;// dp[i]表示前i个字符的最大得分vector<longlong> dp(m + 1, 0);for (int i = 3; i <= m; ++i) // 从第3个字符开始检查 { dp[i] = dp[i - 1]; // 初始化为不选当前字符的情况// 快速检查:只有当前字符是'c'时才可能构成"abc"if (s[i - 1] == 'c') // 注意字符串索引从0开始,所以是s[i-1] {// 检查所有可能的k个"abc"组合(k从1到n)for (int k = 1; k <= n && i >= 3 * k; ++k) {// 检查从i-3k位置开始的k个"abc"是否有效if (isValidABC(s, i - 3 * k, k)) {// 如果有效,更新当前最大得分 dp[i] = max(dp[i], dp[i - 3 * k] + a[k]); } } } }// 输出整个字符串的最大得分cout << dp[m] << endl;return0;}青少年编程竞赛交流
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),添加小助手微信,让他邀请大家进入学习群。进群之后大家可以参与定期组织的21天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。
