涉及考试:计算机学会编程能力等级认证(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/B4356
【问题描述】
直角三角形有两条直角边与一条斜边,设两条直角边的长度分别为 ,则直角三角形的面积为 。
请你计算当直角边长 均取不超过 的正整数时,有多少个不同的面积为整数的直角三角形。直角边长分别为 和 的两个直角三角形相同,当且仅当 或者 。
【输入描述】
一行,一个整数 ,表示直角边长的最大值。
【输出描述】
输出一行,一个整数,表示不同的直角三角形数量。
【样例输入1】
3【样例输出1】
3【样例输入2】
5【样例输出2】
9【数据范围】
对于所有测试点,保证 。
参考答案:
/** [GESP202506 二级] 数三角形* https://www.luogu.com.cn/problem/B4356*/#include<iostream>using namespace std;intmain(){int n, cnt = 0;cin >> n;for (int a = 1;a <= n;a++) {for (int b = a;b <= n;b++) {if ((a * b) % 2 == 0) { cnt++; } } }cout << cnt;return 0;}【提交】
http://noi.openjudge.cn/ch0107/02/
【描述】
给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。
【输入】
一个字符串,长度小于100000。
【输出】
输出第一个仅出现一次的字符,若没有则输出no。
【样例输入】
abcabd【样例输出】
c【参考程序】
C++版本
/** 02:找第一个只出现一次的字符* http://noi.openjudge.cn/ch0107/02/*/#include<iostream>#include<string>using namespace std;intmain(){string str;cin >> str;// 字符串的遍历for (int i = 0; i < str.size(); i++) {char a = str[i];int count = 0;for (int j = 0; j < str.size(); j++) {if (str[j] == a) { count += 1; } }if (count == 1) {cout << a;return 0; } }cout << "no";return 0;}【提交】
https://www.luogu.com.cn/problem/B4005
【问题描述】
小杨有一个 行 列的网格图,其中每个格子要么是白色,要么是黑色。
对于网格图中的一个子矩形,小杨认为它是平衡的当且仅当其中黑色格子与白色格子数量相同。
小杨想知道最大的平衡子矩形包含了多少个格子。
【输入描述】
第一行包含两个正整数 ,含义如题面所示。
之后 行,每行一个长度为 的 串,代表网格图第 行格子的颜色,如果为 ,则对应格子为白色,否则为黑色。
【输出描述】
输出一个整数,代表最大的平衡子矩形包含格子的数量,如果不存在则输出 。
【样例输入1】
4 500000011110001100011【样例输出1】
16【样例解释】
对于样例1,假设 () 代表第 行第 列,最大的平衡子矩形的四个顶点分别为 ,,,。
【数据范围】
对于全部数据,保证有 。
参考答案:
/** [GESP202406 四级] 黑白方块* https://www.luogu.com.cn/problem/B4005*/#include<iostream>using namespace std;char arr[11][11] = { 0 };intcheck(int x1, int y1, int x2, int y2){int a = 0, b = 0, cnt = 0;for (int i = x1;i <= x2;i++) {for (int j = y1;j <= y2;j++) {if (arr[i][j] == '0') { a += 1; }else { b += 1; } cnt += 1; } }return a == b ? cnt : -1;}intmain(){int n, m, max_ = 0;cin >> n >> m;// 读入数据for (int i = 1;i <= n;i++) {for (int j = 1;j <= m;j++) {cin >> arr[i][j]; } }// 处理数据for (int i = 1;i <= n;i++) {for (int j = 1;j <= m;j++) {// 左上角为(i,j)for (int p = i;p <= n;p++) {for (int q = j;q <= m;q++) {//右下角(p,q)int k = check(i, j, p, q);if (k > max_) { max_ = k; } } } } }cout << max_;return 0;}【提交】
http://noi.openjudge.cn/ch0109/05/
【描述】
输出一个整数序列中最大的数和最小的数的差。
【输入】
第一行为 ,表示整数个数,整数个数不会大于10000;
第二行为 个整数,以空格隔开,每个整数的绝对值不会大于10000。
【输出】
输出 个数中最大值和最小值的差。
【样例输入】
52 5 7 4 2【样例输出】
5参考程序
/** 05:最大值和最小值的差* http://noi.openjudge.cn/ch0109/05/*/#include<iostream>using namespace std;intmain(){int max = -1e20, min = 1e20;int m;cin >> m;for (int i = 0;i < m;i++) {int x;cin >> x;if (x > max) { max = x; }if (x < min) { min = x; } }cout << max - min;return 0;}【提交】
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<int> a(N);for (int i = 0; i < N; i++) {cin >> a[i]; }vector<int> dp(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天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。
