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

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

  • 2026-08-25 11:50:49
【第36期】21天养成编程习惯:C++刷题第02天

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

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

Day02:GESP一级2024.06_立方数

【提交】

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

Day02:GESP二级2024.06_平方之和

【提交】

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

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

Day02:GESP四级2025.03_二阶矩阵

【提交】

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

Day02:GESP五级2023.12_烹饪问题

【提交】

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

Day02:GESP六级2023.12_工作沟通

【提交】

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

最新文章

随机文章