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

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

  • 2026-10-21 13:28:37
【第35期】21天养成编程习惯:C++刷题第15天

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

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

Day15:GESP一级2024.06_休息时间

【提交】

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

【问题描述】

小杨计划在某个时刻开始学习,并决定在学习  秒后开始休息。

小杨想知道自己开始休息的时刻是多少。

【输入描述】

前三行每行包含一个整数,分别表示小杨开始学习时刻的时 、分 、秒 (,, 的值符合 )。

第四行包含一个整数 ,表示小杨学习的总秒数(注: 的值符合 )。

【输出描述】

输出一行,包含三个整数,分别表示小杨开始休息时刻的时、分、秒。

【样例输入1】

12595910

【样例输出1】

13 0 9

【样例解释】

小杨在时刻 12:59:59 开始学习,学习  秒后开始休息,即在 13:0:9 时刻开始休息。

【数据范围】

对于全部数据,保证有 , , , 。

【参考答案】

方法一:

/** GESP2024.06* 休息时间*/# include<iostream>using namespace std;intmain(){int h, m, s, k;cin >> h >> m >> s >> k;    s += k;    m += s / 60;    s %= 60;    h += m / 60;    m %= 60;cout << h << " " << m << " " << s;return 0;}

方法二:

/** GESP2024.06* 休息时间*/#include<iostream>using namespace std;intmain(){int h, m, s;cin >> h >> m >> s;int k;cin >> k;int now = h * 60 * 60 + m * 60 + s;    now += k;int hh = now / 3600;    now %= 3600;int mm = now / 60;    now %= 60;cout << hh << " " << mm << " " << now << "\n";return 0;}

Day15:GESP二级2023.09_小杨的 X 字矩阵

【提交】

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

【问题描述】

小杨想要构造一个的字矩阵(为奇数),这个矩阵的两条对角线都是半角加号+,其余都是半角减号-。例如,一个的  字矩阵如下:

+---+-+-+---+---+-+-+---+

请你帮小杨根据给定的打印出对应的“字矩阵”。

【输入描述】

一行一个整数(,保证为奇数)。

【输出描述】

输出对应的“字矩阵”。

请严格按格式要求输出,不要擅自添加任何空格、标点、空行等任何符号。你应该恰好输出行,每行除了换行符外恰好包含个字符,这些字符要么是+,要么是-。

【特别提醒】

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。

【样例输入1】

5

【样例输出1】

+---+-+-+---+---+-+-+---+

【样例输入2】

7

【样例输出2】

+-----+-+---+---+-+-----+-----+-+---+---+-+-----+

参考答案:

/** GESP2023.09二级 小杨的 X 字矩阵* https://www.luogu.com.cn/problem/B3865*/# include<iostream>using namespace std;intmain(){int N;cin >> N;for (int i = 0;i < N;i++)    {for (int j = 0;j < N;j++)        {if (j == i || j + i == N - 1)cout << "+";elsecout << "-";        }cout << endl;    }return 0;}

Day15:GESP三级2024.06_寻找倍数

【提交】

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

【问题描述】

小杨有一个包含  个正整数的序列 ,他想知道是否存在  使得  是序列  中所有数的倍数。

【输入描述】

第一行包含一个正整数 ,代表测试用例组数。

接下来是  组测试用例。

对于每组测试用例,一共两行。其中,第一行包含一个正整数 ;第二行包含  个正整数,代表序列 。

【输出描述】

对于每组测试用例,如果存在 满足对于所有  是  的倍数,输出 Yes,否则输出 No。

【样例输入1】

231 2 451 2 3 4 5

【样例输出1】

YesNo

【样例解释】

对于第一组数据,对于 ,满足  是  和  的倍数。

【数据范围】

对于全部数据,保证有 。

参考答案:

/** GESP:2024.06三级 寻找倍数* https://www.luogu.com.cn/problem/B4004*/#include<iostream>using namespace std;intmain(){int t, n, j;cin >> t;int A[100005] = { 0 };for (int i = 0;i < t;i++)    {int max_v = 0;cin >> n;        for (j = 0;j < n;j++)        {cin >> A[j];if (A[j] > max_v)            {                max_v = A[j];            }        }for (j = 0;j < n;j++)        {if (max_v % A[j] != 0)            {break;            }        }if (j == n)        {cout << "Yes" << endl;        }else        {cout << "No" << endl;        }    }return 0;}

Day15:GESP四级2025.06_排序

【提交】

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

【问题描述】

体育课上有  名同学排成一队,从前往后数第  位同学的身高为 ,体重为 。目前排成的队伍看起来参差不齐,老师希望同学们能按照身高从高到低的顺序排队,如果身高相同则按照体重从重到轻排序。在调整队伍时,每次只能交换相邻两位同学的位置。老师想知道,最少需要多少次交换操作,才能将队伍调整成目标顺序。

【输入描述】

第一行,一个正整数 ,表示队伍人数。

接下来  行,每行两个正整数  和 ,分别表示第  位同学的身高和体重。

【输出描述】

输出一行,一个整数,表示最少需要的交换次数。

【样例输入1】

51 603 702 804 554 50

【样例输出1】

8

【样例输入2】

54 04 02 03 01 0

【样例输出2】

1

【数据范围】

对于所有测试点,保证 ,。

参考答案:

/**  [GESP202506 四级] 排序*  https://www.luogu.com.cn/problem/B4361*/#include<iostream>using namespace std;structstudent{int h;int w;};student arr[3005];intmain(){int n;cin >> n;for (int i = 0;i < n;i++)    {cin >> arr[i].h >> arr[i].w;    }int cnt = 0;for (int i = 0;i < n - 1;i++)    {for (int j = 0;j < n - i - 1;j++)        {if (arr[j].h < arr[j + 1].h)            {                cnt++;                student temp = arr[j];                arr[j] = arr[j + 1];                arr[j + 1] = temp;            }elseif(arr[j].h == arr[j + 1].h)            {if (arr[j].w < arr[j + 1].w)                {                    cnt++;                    student temp = arr[j];                    arr[j] = arr[j + 1];                    arr[j + 1] = temp;                }            }        }    }cout << cnt;return 0;}

Day15:GESP五级2025.06_最大公因数

【提交】

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

【问题描述】

对于两个正整数 ,他们的最大公因数记为 。对于  个正整数 ,他们的最大公因数为:

给定  个正整数  以及  组询问。对于第  组询问,请求出  的最大公因数,也即 。

【输入描述】

第一行,两个正整数 ,分别表示给定正整数的数量,以及询问组数。

第二行, 个正整数 。

【输出描述】

输出共  行,第  行包含一个正整数,表示  的最大公因数。

【样例输入1】

5 36 9 12 18 30

【样例输出1】

113

【样例输入2】

3 531 47 59

【样例输出2】

41214

【说明/提示】

对于  的测试点,保证 ,。

对于所有测试点,保证 ,,。

参考答案:

若,显然有 。

所以:

/** [GESP202506 五级] 最大公因数* https://www.luogu.com.cn/problem/P13014*/# include<iostream># include<algorithm>using namespace std;// 求最大公约数intgcd(int a, int b){if (b == 0) // 处理除数为0的情况    {return a;    }while (a % b != 0)    {int temp = b;        b = a % b;        a = temp;    }return b;}int arr[100005];intmain(){//1 存储数据int n, q;cin >> n >> q;for (int i = 0;i < n;i++)    {cin >> arr[i];    }//2 处理数据    sort(arr, arr + n);int temp = 0; // 初始化差值的GCD为0if (n > 1)    {        temp = arr[1] - arr[0];// 初始化为前两个元素的差值for (int i = 2;i < n;i++)        {            temp = gcd(temp, arr[i] - arr[i - 1]);        }    }// 3 输出结果for (int i = 1;i <= q;i++)    {int current = arr[0] + i;// 如果 n==1,temp 保持为 0if (temp == 0)        {// 如果所有数相同(或n==1),则gcd就是当前数本身cout << current << endl;        }else        {cout << gcd(arr[0] + i, temp) << endl;        }    }return 0;}

Day15:Openjudge2.6.1808_公共子序列

【提交】

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

【描述】

我们称序列  是序列  的子序列当且仅当存在 严格上升 的序列 ,使得对 , 有 。比如  是 的子序列。

现在给出两个序列和,你的任务是找到和的最大公共子序列,也就是说要找到一个最长的序列,使得既是的子序列也是的子序列。

【输入】

输入包括多组测试数据。每组数据包括一行,给出两个长度不超过200的字符串,表示两个序列。两个字符串之间由若干个空格隔开。

【输出】

对每组输入数据,输出一行,给出两个序列的最大公共子序列的长度。

【样例输入】

abcfbc         abfcabprogramming    contest abcd           mnp

【样例输出】

420

【参考程序】

/** 1808:公共子序列* http://noi.openjudge.cn/ch0206/1808/*/# include<algorithm># include<iostream># include<vector>using namespace std;intmain(){string x, y;while (cin >> x >> y)    {int lenx = x.size();int leny = y.size();vector<vector<int>> dp(lenx + 1, vector<int>(leny + 1));for (int i = 1; i <= lenx; i++)        {for (int j = 1; j <= leny; j++)            {if (x[i - 1] != y[j - 1])                {                    dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);                }else                {                    dp[i][j] = dp[i - 1][j - 1] + 1;                }            }        }cout << dp[lenx][leny] << endl;    }return 0;}

青少年编程竞赛交流

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

最新文章

随机文章