涉及考试:计算机学会编程能力等级认证(GESP) 活动内容:提供不同等级的真题供小朋友们选择练习 备考建议:根据自己备考的等级选择相应题目 附加价值:可作为白名单比赛的备考训练 本月打卡:本月打卡题目
【提交】
https://www.luogu.com.cn/problem/B3922
【问题描述】
小杨需要从 到 报数。在报数过程中,小杨希望跳过 的倍数。例如,如果 ,,那么小杨就需要依次报出 、、。
现在,请你依次输出小杨报的数。
【输入描述】
输入 2 行,第一行一个整数 ();第二行一个整数 ()。
【输出描述】
输出若干行,依次表示小杨报的数。
【特别提醒】
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
【样例输入 1】
52【样例输出 1】
135【样例输入 2】
103【样例输出 2】
12457810参考答案:
/** [GESP202312 一级] 小杨报数* https://www.luogu.com.cn/problem/B3922*/# include<iostream>using namespace std;intmain(){int N, M;cin >> N >> M;for (int i = 1; i <= N; i++) {if (i % M != 0) {cout << i << endl; } }return 0;}【提交】
https://www.luogu.com.cn/problem/B3837
【问题描述】
输入一个正整数 ,请使用大写字母拼成一个这样的三角形图案(参考样例输入输出):三角形图案的第 1 行有 1 个字母,第 2 行有 2 个字母,以此类推;在三角形图案中,由上至下、由左至右依次由大写字母 A-Z 填充,每次使用大写字母 Z 填充后,将从头使用大写字母 A 填充。
【输入描述】
输入一行,包含一个正整数 。约定 。
【输出描述】
输出符合要求的三角形图案。注意每行三角形图案的右侧不要有多余的空格。
【样例输入1】
3【样例输出1】
ABCDEF【样例输入2】
7【样例输出2】
ABCDEFGHIJKLMNOPQRSTUVWXYZAB参考答案:
/** GESP2023.03二级 画三角形* https://www.luogu.com.cn/problem/B3837*/#include<iostream>using namespace std;intmain(){int n;cin >> n;int ch = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {cout << (char)('A' + (ch++) % 26); }cout << endl; }return 0;}【提交】
https://www.luogu.com.cn/problem/B4359
【问题描述】
有 位小朋友排成一队等待老师分糖果。第 位小朋友想要至少 颗糖果,并且分给他的糖果数量必须比分给前一位小朋友的糖果数量更多,不然他就会不开心。
老师想知道至少需要准备多少颗糖果才能让所有小朋友都开心。你能帮帮老师吗?
【输入描述】
第一行,一个正整数 ,表示小朋友的人数。
第二行, 个正整数 ,依次表示每位小朋友至少需要的糖果数量。
【输出描述】
输出一行,一个整数,表示最少需要准备的糖果数量。
【样例输入1】
41 4 3 3【样例输出1】
16【样例输入2】
15314 15926 53589793 238462643 383279502 8 8 4 1 9 7 1 6 9 3【样例输出2】
4508143253【数据范围】
对于所有测试点,保证 ,。
参考答案:
/** [GESP202506 三级] 分糖果* https://www.luogu.com.cn/problem/B4359*/#include<iostream>int arr[1005];using namespace std;intmain(){int n;;cin >> n;long long cnt = 0;for (int i = 0;i < n;i++) {cin >> arr[i];if (i > 0 && arr[i] <= arr[i - 1]) { arr[i] = arr[i - 1] + 1; } }for (int i = 0;i < n;i++) { cnt += arr[i]; }cout << cnt;return 0;}【提交】
https://www.luogu.com.cn/problem/B3869
【问题描述】
进制数指的是逢 进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母 A 至 F 表示十至十五;本题中,十一进制到十五进制也是类似的)。
在本题中,我们将给出个不同进制的数。你需要分别把它们转换成十进制数。
提示:
对于任意一个位进制数,假设其最右边的数位为第0位,最左边的数位为第位,我们只需要将其第位的数码乘以权值,再将每位的结果相加,即可得到原进制数对应的十进制数。下面是两个例子:
1、八进制数 1362 对应的十进制数为 ;
2、十六进制数 3F0 对应的十进制数为 。
【输入描述】
输入的第一行为一个十进制表示的整数。接下来行,每行一个整数,随后是一个空格,紧接着是一个进制数,表示需要转换的数。保证所有进制数均由数字和大写字母组成,且不以 0 开头。保证进制数合法。
保证;保证
保证所有进制数的位数不超过9。
【输出描述】
输出行,每一个十进制数,表示对应进制数的十进制数值。
【特别提醒】
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
【样例输入1】
28 136216 3F0【样例输出1】
7541008【样例输入2】
22 1101110 123456789【样例输出2】
27123456789参考答案:
/** GESP202309 四级 进制转换* https://www.luogu.com.cn/problem/B3869*/#include<iostream>#include<string>using namespace std;intfunc(char c){if (c >= '0' && c <= '9') {return c - '0'; }else {return c - 'A' + 10; }}intmain(){int N;cin >> N;for (int i = 0;i < N;i++) {int K;string s;cin >> K >> s;int len = s.size();long long total = 0, p = 1;for (int j = len - 1;j >= 0;j--) { total += func(s[j]) * p; p *= K; }cout << total << endl; }return 0;}【提交】
https://www.luogu.com.cn/problem/P14918
【问题描述】
小 A 有一个包含 个正整数的序列 。小 A 每次可以花费 1 个金币执行以下任意一种操作:
小 A 想请你帮他计算出令序列中所有整数都相同,最少需要花费多少金币。
【输入描述】
第一行一个正整数 ,含义如题面所示。
第二行包含 个正整数 ,代表序列 。
【输出描述】
输出一行,代表最少需要花费的金币数量。
【样例输入1】
510 6 35 105 42【样例输出1】
8【数据范围】
对于60%的测试点,保证 。
对于所有测试点,保证 。
参考答案:
质因数分解:10 = 2¹ × 3⁰ × 5¹ × 7⁰6 = 2¹ × 3¹ × 5⁰ × 7⁰35 = 2⁰ × 3⁰ × 5¹ × 7¹105= 2⁰ × 3¹ × 5¹ × 7¹42 = 2¹ × 3¹ × 5⁰ × 7¹核心思想:对于每个质数,找到所有数字中该质数的指数序列,然后选择中位数作为目标指数,计算所有数字调整到目标指数所需的操作次数之和。这是因为数学上,中位数最小化绝对差之和。
/** [GESP202512 五级] 相等序列* https://www.luogu.com.cn/problem/P14918*/# include<iostream># include<algorithm># include<vector># include<cmath>using namespace std;vector<int> p[100005];// 存储每个质数对应的指数列表intmain(){int n;cin >> n;for (int i = 0; i < n; i++) {int x;cin >> x;// 对x进行质因数分解for (int j = 2; j * j <= x; j++) {if (x % j == 0) {int cnt = 0;while (x % j == 0) { cnt++; x /= j; } p[j].push_back(cnt);// 记录质数j的指数 } }if (x != 1) { p[x].push_back(1);// 处理剩余的质数 } }long long ans = 0;// 枚举质数for (int i = 2; i <= 100000; i++) {if (p[i].empty()) continue; sort(p[i].begin(), p[i].end());// 排序指数int cnt0 = n - p[i].size();// 指数为0的数字个数int mid = (1 + n) / 2; // 中位数位置(从1开始)int t = 0; // 目标指数,默认0if (mid > cnt0) { t = p[i][mid - cnt0 - 1];//mid比0多几个 }for (int x : p[i]) { ans += abs(x - t); } ans += cnt0 * t;//每个指数为0的代价都是t,总个数有cnt0个 }cout << ans << endl;return 0;}【提交】
https://www.luogu.com.cn/problem/P13015
【问题描述】
班主任计划将班级里的 名同学划分为若干个学习小组,每名同学都需要分入某一个学习小组中。观察发现,如果一个学习小组中恰好包含 名同学,则该学习小组的讨论积极度为 。
给定讨论积极度 ,请你计算将这 名同学划分为学习小组的所有可能方案中,讨论积极度之和的最大值。
【输入描述】
第一行,一个正整数 ,表示班级人数。
第二行, 个非负整数 ,表示不同人数学习小组的讨论积极度。
【输出描述】
输出共一行,一个整数,表示所有划分方案中,学习小组讨论积极度之和的最大值。
【样例输入1】
41 5 6 3【样例输出1】
10【样例输入2】
80 2 5 6 4 3 3 4【样例输出2】
12【说明/提示】
对于 的测试点,保证 。
对于所有测试点,保证 ,。
参考答案:
/** P13015 [GESP202506 六级] 学习小组* https://www.luogu.com.cn/problem/P13015*/#include<iostream>#include<vector>#include<algorithm>using namespace std;intmain(){int n;cin >> n;vector<int> a(n + 1);for (int i = 1; i <= n; i++) {cin >> a[i]; }vector<int> dp(n + 1, 0);for (int i = 1; i <= n; ++i) {for (int j = 1; j <= i; ++j) { dp[i] = max(dp[i], dp[i - j] + a[j]); } }cout << dp[n] << endl;return 0;}青少年编程竞赛交流
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),添加小助手微信,让他邀请大家进入学习群。进群之后大家可以参与定期组织的21天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。
