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

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

  • 2026-09-06 11:31:51
【第35期】21天养成编程习惯:C++刷题第09天

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

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

Day09:GESP一级2025.09_金字塔

【提交】

https://www.luogu.com.cn/problem/B4410

【问题描述】

金字塔由  层石块垒成。从塔底向上,每层依次需要 ,  块石块。请问搭建金字塔总共需要多少块石块?

【输入描述】

一行,一个正整数 ,表示金字塔的层数。

【输出描述】

一行,一个正整数,表示搭建金字塔所需的石块数量。

【样例输入1】

2

【样例输出1】

5

【样例输入2】

5

【样例输出2】

55

【提示】

对于所有测试点,保证 

参考答案:

/** [GESP202509 一级] 金字塔* https://www.luogu.com.cn/problem/B4410*/#include<iostream>using namespace std;intmain(){int n, ans = 0;cin >> n;for (int i = 1; i <= n; i++)    {        ans += i * i;    }cout << ans << endl;return 0;}

Day09:GESP二级2025.09_菱形

【提交】

https://www.luogu.com.cn/problem/B4412

【问题描述】

小 A 想绘制一个菱形。具体来说,需要绘制的菱形是一个  行  列的字符画, 是一个大于  的奇数。菱形的四个顶点依次位于第  行、第  列、第  行、第  列的正中间,使用 # 绘制。相邻顶点之间也用 # 连接。其余位置都是 .。例如,一个  行  列的菱形字符画是这样的:

..#...#.#.#...#.#.#...#..

给定 ,请你帮小 A 绘制对应的菱形。

【输入描述】

一行,一个正整数 

【输出描述】

输出共  行,表示对应的菱形。

【样例输入1】

3

【样例输出1】

.#.#.#.#.

【样例输入2】

9

【样例输出2】

....#.......#.#.....#...#...#.....#.#.......#.#.....#...#...#.....#.#.......#....

【数据范围】

对于所有测试点,保证  并且  为奇数。

参考答案:

#include<iostream>#include<cmath>  // 用于abs函数using namespace std;intmain(){int n;cin >> n;// 计算中心点坐标(行列从0开始计数)int center = n / 2;// 遍历每一行for (int i = 0; i < n; i++)     {// 遍历每一列for (int j = 0; j < n; j++)         {// 计算当前点到中心点的曼哈顿距离int distance = abs(i - center) + abs(j - center);// 如果曼哈顿距离等于中心点到顶点的距离,则输出'#',否则输出'.'if (distance == center)             {cout << "#";            } else            {cout << ".";            }        }cout << endl;  // 换行    }return 0;}

Day09:GESP三级2023.12_单位转换

【提交】

https://www.luogu.com.cn/problem/B3926

【问题描述】

小杨这周的数学作业是做单位转换,喜欢编程的小杨决定编程帮他解决这些问题。

小杨只学了长度单位和重量单位,具体来说:

  • 长度单位包括千米()、米()、毫米(),它们之间的关系是:
  • 重量单位包括千克()、克()、毫克(),它们之间的关系是:

小杨的作业只涉及将更大的单位转换为更小的单位,也就是说,小杨的作业只会包含如下题型:米转换为毫米,千米转换为毫米,千米转换为米,克转换为毫克,千克转换为毫克,千克转换为克。

现在,请你帮忙完成单位转换的程序。

【输入描述】

输入的第一行为一个整数,表示题目数量。

接下来行,每行一个字符串,表示转换单位的题目,格式为 x 单位1 = ? 单位2 。其中,x 为一个不超过1000的非负整数, 单位1 和 单位2 分别为两个单位的英文缩写,保证它们都是长度单位或都是重量单位,且 单位1 比 单位2 更大。

例如,如果题目需要你将 1km 转换为 mm,则输入为 1 km = ? mm 。

保证 

【输出描述】

输出行,依次输出所有题目的答案,输出时,只需要将输入中的 代入答案,其余部分一字不差地输出即可。

由于小杨的题目只涉及将更大的单位转换为更小的单位,并且输入的 x 是整数,因此答案一定也是整数。

例如,如果题目需要你将 1km 转换为 mm,输入为 1 km = ? mm,则你需要输出 1 km = 1000000 mm 。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。输入格式将严格按照题目要求,且你的输出必须和标准答案完全一致才能得分,请在提交前仔细检查。

【样例输入1】

21 km = ? mm1 m = ? mm

【样例输出1】

1 km = 1000000 mm1 m = 1000 mm

【样例输入2】

5100 m = ? mm1000 km = ? m20 kg = ? g200 g = ? mg0 kg = ? mg

【样例输出2】

100 m = 100000 mm1000 km = 1000000 m20 kg = 20000 g200 g = 200000 mg0 kg = 0 mg

参考答案:

/** [GESP202312 三级] 单位转换* https://www.luogu.com.cn/problem/B3926*/#include<iostream>#include<string>using namespace std;intmain(){int n;cin >> n;for (int i = 0; i < n; i++)    {int x,k=1;string s1, s2, s3, s4;cin >> x >> s1 >> s2 >> s3 >> s4;if (s4.size() == 1)        {            k = 1000;        }else        {            k = s1.size() == 1 ? 1000 : 1000000;        }cout << x << ' ' << s1 << ' ' << s2 << ' ';cout << x * k << ' ' << s4;           }return 0;}

Day09:GESP四级2025.06_画布裁剪

【提交】

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

Day09:GESP五级2023.12_小杨的幸运数

【提交】

https://www.luogu.com.cn/problem/B3929

【问题描述】

小杨认为,所有大于等于  的完全平方数都是他的超级幸运数。

小杨还认为,所有超级幸运数的倍数都是他的幸运数。自然地,小杨的所有超级幸运数也都是幸运数。

对于一个非幸运数,小杨规定,可以将它一直 ,直到它变成一个幸运数。我们把这个过程叫做幸运化。例如,如果,那么  是最小的幸运数,而  不是,但我们可以连续对  做  次  操作,使其变为 ,所以我们可以说, 幸运化后的结果是 

现在,小杨给出  个数,请你首先判断它们是不是幸运数;接着,对于非幸运数,请你将它们幸运化。

【输入描述】

第一行  个正整数 

接下来  行,每行一个正整数  ,表示需要判断(幸运化)的数。

【输出描述】

输出  行,对于每个给定的  ,如果它是幸运数,请输出 lucky,否则请输出将其幸运化后的结果。

【样例输入1】

2 4 9

【样例输出1】

lucky lucky

【样例解释1】

虽然是完全平方数,但它小于 ,因此它并不是超级幸运数,也不是幸运数。将其进行  次  操作后,最终得到幸运数 是幸运数,因此直接输出 lucky 。

 不是幸运数,将其进行  次  操作后,最终得到幸运数 

 是幸运数,因此直接输出 lucky 。

【样例输入2】

16 11 16 32 64 128 256 5121024

【样例输出2】

16 16 16 16 lucky lucky lucky lucky lucky lucky lucky

【数据规模】

  • 对于  的测试点,保证 
  • 对于  的测试点,保证 
  • 对于所有测试点,保证 ;保证 ;保证 

参考答案:

/** [GESP202312 五级] 小杨的幸运数* https://www.luogu.com.cn/problem/B3929*/include<iostream>include<cmath>using namespace std;const int N = 1000005;int arr[N];intmain(){// 利用桶标记的思维来做int a, n;cin >> a >> n;int b = ceil(sqrt(a));for (int i = b;i * i < N;i++)    {for (int j = i * i;j < N;j += i * i)            arr[j] = j;    }for (int i = 0;i < n;i++)    {int x;cin >> x;if (arr[x] == x)        {cout << "lucky" << endl;        }else        {int j = x;while (arr[j] == 0)            {                j++;            }cout << j << endl;        }    }return 0;}

Day09:Openjudge2.6.1759_最长上升子序列

【提交】

http://noi.openjudge.cn/ch0206/1759/

【描述】

一个数的序列 ,当  的时候,我们称这个序列是上升的。对于给定的一个序列 ,我们可以得到一些上升的子序列 ,这里 。比如,对于序列,有它的一些上升子序列,如等等。这些子序列中最长的长度是4,比如子序列

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

【输入】

输入的第一行是序列的长度。第二行给出序列中的个整数,这些整数的取值范围都在

【输出】

最长上升子序列的长度。

【样例输入】

71 7 3 5 9 4 8

【样例输出】

4

【参考程序】

/** 1759:最长上升子序列* http://noi.openjudge.cn/ch0206/1759/*/#include<iostream>#include<vector>#include<algorithm>using namespace std;intmain(){int N;cin >> N;vector<inta(N);for (int i = 0; i < N; i++)     {cin >> a[i];    }vector<intdp(N, 1);for (int i = 0; i < N; i++)     {for (int j = 0; j < i; j++)         {if (a[j] < a[i])             {                dp[i] = max(dp[i], dp[j] + 1);            }        }    }int maxLen = 0;for (int len : dp)     {        maxLen = max(maxLen, len);    }cout << maxLen << endl;return 0;}

青少年编程竞赛交流

「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),添加小助手微信,让他邀请大家进入学习群。进群之后大家可以参与定期组织的21天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。

最新文章

随机文章