涉及考试:计算机学会编程能力等级认证(GESP) 活动内容:提供不同等级的真题供小朋友们选择练习 备考建议:根据自己备考的等级选择相应题目 附加价值:可作为白名单比赛的备考训练 本月打卡:本月打卡题目
【提交】
https://www.luogu.com.cn/problem/B4001
【问题描述】
小杨有一个正整数 ,他想知道 是否是一个立方数。
一个正整数 是立方数当且仅当存在一个正整数 满足 。
【输入描述】
第一行包含一个正整数 。
【输出描述】
如果正整数 是一个立方数,输出 Yes,否则输出 No。
【样例输入1】
8【样例输出1】
Yes【样例输入2】
9【样例输出2】
No【样例解释】
对于样例1,存在正整数 使得 ,因此 为立方数。
对于样例2,不存在满足条件的正整数,因此 不为立方数。
【数据范围】
对于全部数据,保证有 。
【参考答案】
/** GESP2024.06 立方数* https://www.luogu.com.cn/problem/B4001*/# include<iostream>using namespace std;intmain(){int n;cin >> n;for (int i = 1; i * i * i <= n; i++) {if (i * i * i == n) {cout << "Yes";return 0; } }cout << "No";return 0;}【提交】
https://www.luogu.com.cn/problem/B4002
【问题描述】
小杨有 个正整数 ,他想知道对于所有的 (),是否存在两个正整数 和 满足 。
【输入描述】
第一行包含一个正整数 ,代表正整数数量。
之后 行,每行包含一个正整数,代表 。
【输出描述】
对于每个正整数 ,如果存在两个正整数 和 满足 ,输出 Yes,否则输出 No。
【样例输入1】
254【样例输出1】
YesNo【样例解释】
对于第一个正整数,存在 ,因此答案为 Yes。
【数据范围】
对于全部数据,保证有 。
参考答案:
/** [GESP202406 二级] 平方之和* https://www.luogu.com.cn/problem/B4002*/# include<iostream># include<cmath>using namespace std;intmain(){int n;cin >> n;for (int i = 0;i < n;i++) {int a;cin >> a;bool flag = false;for (int x = 1;x*x < a;x++) {int y = int(sqrt(a - x * x));if (y * y + x * x == a) { flag = true;cout << "Yes" << endl;break; } }if (flag == false) {cout << "No" << endl; } }return 0;}【提交】
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;}【提交】
https://www.luogu.com.cn/problem/B4264
【问题描述】
小 A 有一个 行 列的矩阵 。
小 A 认为一个 的矩阵 是好的,当且仅当 。其中 表示矩阵 的第 行第 列的元素。
小 A 想知道 中有多少个好的子矩阵。
【输入描述】
第一行,两个正整数 。
接下来 行,每行 个整数 。
【输出描述】
一行,一个整数,表示 中好的子矩阵的数量。
【样例输入1】
3 41 2 1 02 4 2 10 3 3 0【样例输出1】
2【样例解释】
样例中好的子矩阵如下:

【数据范围】
对于所有测试点,保证 ,,
参考答案:
/** [GESP202503 四级] 二阶矩阵* https://www.luogu.com.cn/problem/B4264*/# include<iostream>using namespace std;int arr[505][505];boolcheck(int i, int j){// (i,j)左上角坐标if (arr[i][j] * arr[i + 1][j + 1] == arr[i][j + 1] * arr[i + 1][j])return true;return false;}intmain(){// 1. 存储数据int n, m;cin >> n >> m;for (int i = 0;i < n;i++) {for (int j = 0;j < m;j++) {cin >> arr[i][j]; } }// 2. 处理数据int ans = 0;for (int i = 0;i <= n - 2;i++) {for (int j = 0;j <= m - 2;j++) {if (check(i, j)==true) { ans += 1; } } }// 3. 输出结果cout << ans << endl;return 0;}【提交】
https://www.luogu.com.cn/problem/B3930
【问题描述】
有 种食材,编号从 至 ,其中第 种食材的美味度为 。
不同食材之间的组合可能产生奇妙的化学反应。具体来说,如果两种食材的美味度分别为 和 ,那么它们的契合度为 。
其中, 运算为按位与运算,需要先将两个运算数转换为二进制,然后在高位补足,再逐位进行与运算。例如, 与 的二进制表示分别为 和 ,将它们逐位进行与运算,得到 ,转换为十进制得到 ,因此 。在 C++ 或 Python 中,可以直接使用 & 运算符表示与运算。
现在,请你找到契合度最高的两种食材,并输出它们的契合度。
【输入描述】
第一行一个整数 ,表示食材的种数。
接下来一行 个用空格隔开的整数,依次为 ,表示各种食材的美味度。
【输出描述】
输出一行一个整数,表示最高的契合度。
【样例输入1】
31 2 3【样例输出1】
2【样例解释 1】
可以编号为 的食材之间的契合度为 ,是所有食材两两之间最高的契合度。
【样例输入2】
55 6 2 10 13【样例输出2】
8【样例解释 2】
可以编号为 的食材之间的契合度为 ,是所有食材两两之间最高的契合度。
【数据范围】
对于 的测试点,保证 ;
对于所有测试点,保证 ,。
参考答案:
/** [GESP202312 五级] 烹饪问题* https://www.luogu.com.cn/problem/B3930*/# include<iostream># include<vector>using namespace std;intmain(){// 1. 存储数据int N;cin >> N;vector<int> a(N);for (int i = 0;i < N;i++) {cin >> a[i]; }// 2. 处理数据:利用按位与运算的性质,从最高位到最低位逐步确定最大的可能结果vector<int> candidates = a;int mask = 0;// a的最大值是2^31-1,所以i从30开始// 从最高位(30位)到最低位(0位)依次检查每一位是否可以被加入当前掩码。for (int i = 30;i >= 0;i--) {// 对于每一位,生成候选掩码,并筛选出满足当前候选掩码条件的数。int mask_ = mask | (1 << i);vector<int> temp;int count = 0;for (int num : candidates) { if ((num & mask_) == mask_) { temp.push_back(num); count++; } }//如果满足条件的数至少有2个,更新掩码并缩小候选数组范围,继续处理更低位。if (count >= 2) { mask = mask_; candidates = temp; } }cout << mask; return 0;}【提交】
https://www.luogu.com.cn/problem/P10109
【问题描述】
某公司有 名员工,编号从 至 。其中,除了 号员工是老板,其余每名员工都有一个直接领导。我们假设编号为 的员工的直接领导是 。
该公司有严格的管理制度,每位员工只能受到本人或直接领导或间接领导的管理。具体来说,规定员工 可以管理员工 ,当且仅当 ,或 ,或 可以管理 。特别地, 号员工老板只能自我管理,无法由其他任何员工管理。
现在,有一些同事要开展合作,他们希望找到一位同事来主持这场合作,这位同事必须能够管理参与合作的所有同事。如果有多名满足这一条件的员工,他们希望找到编号最大的员工。你能帮帮他们吗?
【输入描述】
第一行一个整数 ,表示员工的数量。
第二行 个用空格隔开的正整数,依次为 。
第三行一个整数 ,表示共有 场合作需要安排。
接下来 行,每行描述一场合作:开头是一个整数 (),表示参与本次合作的员工数量;接着是 个整数,依次表示参与本次合作的员工编号(保证编号合法且不重复)。
保证公司结构合法,即不存在任意一名员工,其本人是自己的直接或间接领导。
【输出描述】
输出 行,每行一个整数,依次为每场合作的主持人选。
【样例输入1】
50 0 2 232 3 43 2 3 42 1 4【样例输出1】
220【样例解释1】
对于第一场合作,员工 有共同领导 ,可以主持合作。
对于第二场合作,员工 本人即可以管理所有参与者。
对于第三场合作,只有 号老板才能管理所有员工。
【样例输入2】
70 1 0 2 1 252 4 62 4 53 4 5 64 2 4 5 62 3 4【样例输出2】
21110【数据范围】
对于 的测试点,保证 。
对于所有测试点,保证 ,。
参考答案:
/** [GESP202312 六级] 工作沟通* https://www.luogu.com.cn/problem/P10109*/# include<iostream># include<vector>using namespace std;vector<int> parent = {-1};//存父亲节点vector<int> c;// 从x开始寻找父亲节点,记录出现次数voidfind(int x){while (x != -1) { c[x] += 1; x = parent[x]; }}intmain(){//1、存储数据int n;cin >> n;for (int i = 1;i < n;i++) {int p;cin >> p; parent.push_back(p); }int q;cin >> q;for (int i = 0;i < q;i++) {int m;cin >> m; c.assign(n, 0);for (int j = 0;j < m;j++) {int k;cin >> k; find(k); }// 2、处理数据int ma = 0;for (int j = 0;j < n;j++) {if (c[j] == m && ma < j) { ma = j; } }// 3、输出结果cout << ma << endl; }return 0;}青少年编程竞赛交流
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),添加小助手微信,让他邀请大家进入学习群。进群之后大家可以参与定期组织的21天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。
