当前位置:首页>java>【第36期】21天养成编程习惯:C++刷题第09天

【第36期】21天养成编程习惯:C++刷题第09天

  • 2026-10-03 19:26:09
【第36期】21天养成编程习惯:C++刷题第09天

跟老马一起“升级打怪”学编程!

  • 涉及考试:计算机学会编程能力等级认证(GESP)
  • 活动内容:提供不同等级的真题供小朋友们选择练习
  • 备考建议:根据自己备考的等级选择相应题目
  • 附加价值:可作为白名单比赛的备考训练
  • 本月打卡:本月打卡题目

Day09:GESP一级2023.12_小杨报数

【提交】

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;}

Day09:GESP二级2023.03_画三角形

【提交】

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;}

Day09:GESP三级2025.06_分糖果

【提交】

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;}

Day09:GESP四级2023.09_进制转换

【提交】

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;}

Day09:GESP五级2025.12_相等序列

【提交】

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;}

Day09:GESP六级2025.06_学习小组

【提交】

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天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。

最新文章

随机文章