官方题解 | 欢乐赛#73题解
2026-05-20 15:58:28
发布于:浙江
官方题解 | 欢乐赛#73题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔的天气预报 | 入门 |
| T2 | 皓仔的考试结果 | 入门 |
| T3 | 皓仔的配对检测 | 入门 |
| T4 | 皓仔的表格观察 | 入门 |
| T5 | 皓仔的上升子数组 | 普及- |
| T6 | 皓仔的质数子矩阵 | 普及- |
T1 皓仔的天气预报
题目大意
给定月份,日期,温度,按照以下格式输出今日的天气预报。
m月d日,今天气温t度。
题解思路
定义三个变量 , 用以表示月份,日期还有温度。
而后使用 printf 函数根据题目给定的格式输出一份天气预报即可。
参考代码
#include<iostream>
using namespace std;
int main() {
int m, d, t;
cin >> m >> d >> t;
printf("%d月%d日,今天气温%d度。", m, d, t);
}
T2 皓仔的考试结果
题目大意
学期结束后,皓仔拿到了两门成绩:
- 平时成绩
- 期末成绩
老师规定,只要满足下面任意一种情况,就算通过考试:
- 期末成绩大于等于
- 平时成绩和期末成绩都大于等于
现在请你根据皓仔的两门成绩,判断他是否通过考试。
如果通过考试,输出 Pass;否则输出 Fail。
题解思路
定义两个变量 用以存储皓仔的平时成绩以及期末成绩。
对于能够通过的两种情况 :
-
期末成绩大于等于 分,也就是
b >= 90 -
平时成绩和期末成绩都大于等于 分, 也就是
a >= 60 && b >= 60
两个情况只要满足其中一个就可以通过考试了,所以可以将两个条件使用逻辑或运算符连接,也就是 b >= 90 || a >= 60 && b >= 60, 此时输出 Pass, 否则输出 Fail。
参考代码
#include<iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
if(b >= 90 || a >= 60 && b >= 60) cout << "Pass";
else cout << "Fail";
}
T3 皓仔的配对检测
题目大意
给定两个长度为 的数组 和 。
对于每一对下标相同的数字 ,如果它们的和是偶数,皓仔就认为这一对是“合格配对”。
现在皓仔想知道:
在全部 对数字中,“合格配对”所占的百分比,是否落在区间 内。
如果满足,输出 Yes;否则输出 No。
题解思路
首先使用循环分别输入两个数组, 而后从 遍历整个数组, 每当发现 (a[i] + b[i]) % 2 == 0 时候,则配对数量 加一。
那么此时的配对比例的百分数就是 cnt * 100.0 / n, 此处为了计算百分数的值同时转化成小数输出,因此在算式中乘以了 1.0 。
最后根据该百分数是否落在 之间来决定输出 Yes 或者 No。
参考代码
#include<iostream>
using namespace std;
int A[1010], B[1010], n, a, b;
int main() {
cin >> n >> a >> b;
for(int i = 1; i <= n; i++) cin >> A[i];
for(int i = 1; i <= n; i++) cin >> B[i];
int cnt = 0;
for(int i = 1; i <= n; i++) {
if((A[i] + B[i]) % 2 == 0) cnt++;
}
double res = cnt * 100.0 / n;
if(res >= a && res <= b) cout << "Yes";
else cout << "No";
}
T4 皓仔的表格观察
题目大意
给定一个 行 列的整数表格。
对于一个点的坐标 , 如果第 列的总和小于等于第 行的总和,
那么皓仔这个位置是一个“合格点”。
现在请你帮皓仔统计:整个表格中一共有多少个“合格点”。
题解思路
本题可以考虑对于每个点 , 直接循环遍历求第 行以及第 列的总和来判断合格点。
也可以使用更简洁一些的写法,额外开两个数组 以及 来存储每一行的总和以及每一列的总和,例如 sum1[i] 表示第 行的总和, sum2[j]表示第 列的总和。
遍历所有的位置 , 那么第 列的总和小于等于第 行的总和可以直接用 sum2[j] >= sum1[i] 来进行判定,统计合格点的数量然后输出即可。
参考代码
#include<iostream>
using namespace std;
long long a[510][510], sum1[510], sum2[510];
int n, m;
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++) {
cin >> a[i][j];
sum1[i] += a[i][j];
sum2[j] += a[i][j];
}
}
int cnt = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
if(sum2[j] <= sum1[i]) cnt++;
cout << cnt << endl;
}
T5 皓仔的上升子数组
题目大意
皓仔写下了 个十六进制数,并按顺序排成了一个序列。
注意这些十六进制数的数位可能很多,每个数的长度最多可达 位。
现在,皓仔想知道:在这个序列中,最长的“连续上升子数组”长度是多少。
题解思路
需要注意的是本题中的十六进制数数位可能非常多,因此转化成十进制数再做比较式做不到的,因为对应的十进制数没法儿存储。
因此本题中的每一个数字需要用字符串存储,数字大小的比较也需要以字符串的形式来进行判断。
字符串存储的数字比大小可以按照以下规则:
- 数字长度不一样的,则长度更大的数值更大。
- 数字长度一样的, 则字典序更大的则数值更大。
从前往后遍历每一个数字,当前数字比前一个数更大的话,则连续上升子数组长度加一, 否则上升子数组长度重置为 , 过程中不断更新答案的最大值即可。
参考代码
#include<iostream>
using namespace std;
int n, ans = 1;
string s[1010];
int main() {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> s[i];
}
int len = 1;
for(int i = 2; i <= n; i++) {
if(s[i].size() > s[i - 1].size() || s[i].size() == s[i - 1].size() && s[i] > s[i - 1]) len++;
else len = 1;
ans = max(ans, len);
}
cout << ans;
}
T6 皓仔的上升子数组
题目大意
给定一个 行 列的整数矩阵。
问在这个矩阵的所有子矩阵中,一共有多少个子矩阵的元素和是质数。
题解思路
本题需要枚举所有的子矩阵并且求总和,需要掌握枚举子矩阵的方法。
可以先枚举子矩阵的左上角的坐标 , 再枚举右下角的坐标 , 那么就可以得到一个行号为 , 列号为 的子矩阵。
因此可以通过四重的循环嵌套分别枚举 , 注意需要满足 k >= i 并且 t >= j并且在该矩阵内部求子矩阵的总和, 然后使用试除法判定是否是质数, 如果是质数的话则答案加一。
参考代码
#include<iostream>
using namespace std;
int a[21][21], n, m, ans;
bool check(int x) {
if(x <= 1) return false;
for(int i = 2; i * i <= x; i++) {
if(x % i == 0) return false;
}
return true;
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) cin >> a[i][j];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
for(int k = i; k <= n; k++)
for(int t = j; t <= m; t++){
int sum = 0; // 计算子矩阵总和
for(int x = i; x <= k; x++)
for(int y = j; y <= t; y++) sum += a[x][y];
if(check(sum)) ans++;
}
cout << ans;
}
全部评论 3
ACGO 十大诡异账户之一
昨天 来自 重庆
1首屏
昨天 来自 浙江
1555
昨天 来自 浙江
0



























有帮助,赞一个