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

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

  • 2026-08-25 22:08:12
【第36期】21天养成编程习惯:C++刷题第03天

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

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

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

Day03:GESP二级2025.06_数三角形

【提交】

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

Day03:Openjudge1.7.02_找第一个只出现一次的字符

【提交】

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

Day03:GESP四级2024.06_黑白方块

【提交】

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

Day03:Openjudge1.9.05_最大值和最小值的差

【提交】

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

Day03:Openjudge2.6.1759_最长上升子序列

【提交】

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

最新文章

随机文章