涉及考试:计算机学会编程能力等级认证(GESP) 活动内容:提供不同等级的真题供小朋友们选择练习 备考建议:根据自己备考的等级选择相应题目 附加价值:可作为白名单比赛的备考训练 本月打卡:本月打卡题目
【提交】
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;}【提交】
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;}【提交】
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;}【提交】
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;}【提交】
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;}【提交】
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天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。
