官方题解 | 欢乐赛#78题解
2026-07-29 15:04:56
发布于:浙江
官方题解 | 欢乐赛#78题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
| 题目编号 | 题目名称 | 题目难度 |
|---|---|---|
| T1 | 皓仔的BMI | 入门 |
| T2 | 皓仔的体重等级 | 入门 |
| T3 | 皓仔的字母变换 | 入门 |
| T4 | 皓仔的寻宝之路 | 入门 |
| T5 | 皓仔的数组检测 | 普及- |
| T6 | 皓仔的矩阵魔法 | 普及- |
T1 皓仔的BMI
题意简述
给定皓仔的身高 h(单位:米)和体重 w(单位:千克)。
根据公式:
计算 BMI 值,并保留两位小数输出。
解题思路
直接按照公式计算即可。
注意:
- 身高是小数,需要使用
double类型; - 输出保留两位小数,可以使用
printf("%.2f", ans)。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
double h, w;
cin >> h >> w;
double bmi = w / (h * h);
printf("%.2f", bmi);
return 0;
}
T2 皓仔的体重等级
题意简述
给定皓仔的身高 h 和体重 w。
先根据公式计算 BMI:
再根据 BMI 判断体重等级:
BMI < 18.5:输出偏瘦18.5 <= BMI < 24:输出正常24 <= BMI < 28:输出超重BMI >= 28:输出肥胖
解题思路
先使用 double 类型读入身高和体重,并计算 BMI。
然后按照 BMI 从小到大的区间依次判断。
使用 if...else if...else 时,前面的条件不成立后,后面的判断不需要重复写左端点。
例如,判断到 bmi < 24 时,已经可以确定 bmi >= 18.5。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
double h, w;
cin >> h >> w;
double bmi = w / (h * h);
if (bmi < 18.5) {
cout << "偏瘦";
} else if (bmi < 24) {
cout << "正常";
} else if (bmi < 28) {
cout << "超重";
} else {
cout << "肥胖";
}
return 0;
}
T3 皓仔的字母变换
题意简述
给定一个字符串 s 和整数 ,依次处理字符串中的每个字符:
- 大写字母在大写字母表中向后移动 位;
- 小写字母在小写字母表中向前移动 位;
- 其他字符保持不变。
字母移动超过边界时,需要循环到字母表的另一端。
解题思路
英文字母表中共有 个字母,因此先令 x %= 26。
遍历字符串中的每个字符:
- 如果是大写字母,可以先减去
'A',转换为 的编号,再加上x并对 取模; - 如果是小写字母,可以先减去
'a',转换为 的编号,再减去x。为了避免出现负数,可以额外加上 后再取模; - 其他字符不需要修改。
时间复杂度为 ,空间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
long long x;
getline(cin, s);
cin >> x;
x %= 26;
for(int i = 0; i < s.size(); i++) {
if(s[i] >= 'A' && s[i] <= 'Z') {
s[i] = (s[i] - 'A' + x) % 26 + 'A';
} else if(s[i] >= 'a' && s[i] <= 'z') {
s[i] = (s[i] - 'a' - x + 26) % 26 + 'a';
}
}
cout << s << '\n';
return 0;
}
T4 皓仔的寻宝之路
题意简述
一条路线上有 个位置,每个位置都有对应的宝藏价值。
皓仔从第 x 个位置出发,按照字符串中的 L 和 R 进行 次移动:
L表示向左移动一格;R表示向右移动一格;- 如果移动后超出 的范围,则停留在原位置,并且不获得宝藏;
- 如果移动成功,则获得新位置的宝藏价值。
求皓仔最终获得的宝藏总价值。
解题思路
使用变量 x 记录皓仔当前所在的位置,依次处理每次移动:
- 遇到
L时,判断x - 1是否仍在路线范围内; - 遇到
R时,判断x + 1是否仍在路线范围内; - 如果移动成功,就更新
x,并将a[x]加入答案; - 如果移动失败,则什么也不做。
起点的宝藏价值不需要加入答案。
时间复杂度为 ,空间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int m, x, n;
int a[1010];
long long ans;
string s;
int main() {
cin >> m >> x >> n;
for(int i = 1; i <= m; i++) {
cin >> a[i];
}
cin >> s;
for(int i = 0; i < n; i++) {
if(s[i] == 'L') {
if(x - 1 >= 1) {
x--;
ans += a[x];
}
} else {
if(x + 1 <= m) {
x++;
ans += a[x];
}
}
}
cout << ans << '\n';
return 0;
}
T5 皓仔的数组检测
题意简述
对于每组数组,分别计算:
- 下标为奇数的位置上的元素之和;
- 下标为偶数的位置上的元素之和。
如果奇数位置元素之和是质数,并且偶数位置元素之和是回文数,则输出 Yes,否则输出 No。
解题思路
读入数组时,根据当前位置的奇偶性分别累计:
sum1表示奇数位置元素之和;sum2表示偶数位置元素之和。
然后分别进行判断:
- 判断
sum1是否为质数。枚举 ,检查是否存在因数; - 判断
sum2是否为回文数。将其各位数字反转,判断反转后的数字是否与原数相同。
只有两个条件同时满足时,数组才是合格数组。
由于元素之和最大可能达到 ,需要使用 long long 存储。
参考代码
#include <bits/stdc++.h>
using namespace std;
bool isPrime(long long x) {
if(x < 2) {
return false;
}
for(long long i = 2; i <= x / i; i++) {
if(x % i == 0) {
return false;
}
}
return true;
}
bool isPalindrome(long long x) {
long long t = x;
long long rev = 0;
while(t > 0) {
rev = rev * 10 + t % 10;
t /= 10;
}
return rev == x;
}
int main() {
int T;
cin >> T;
while(T--) {
int n;
cin >> n;
long long sum1 = 0;
long long sum2 = 0;
for(int i = 1; i <= n; i++) {
long long x;
cin >> x;
if(i % 2 == 1) {
sum1 += x;
} else {
sum2 += x;
}
}
if(isPrime(sum1) && isPalindrome(sum2)) {
cout << "Yes\n";
} else {
cout << "No\n";
}
}
return 0;
}
T6 皓仔的矩阵魔法
题意简述
给定一个 行 列的矩阵,需要依次进行 次操作。
每次操作会指定一个子矩阵:
- 当
op = 1时,将子矩阵中的所有元素加上v; - 当
op = 2时,将子矩阵中的所有元素减去v; - 当
op = 3时,将子矩阵中的所有元素赋值为v。
完成所有操作后,输出最终矩阵。
解题思路
由于 ,,数据范围较小,可以直接模拟每次操作。
对于每次操作,枚举子矩阵中的所有位置:
- 如果
op == 1,执行a[i][j] += v; - 如果
op == 2,执行a[i][j] -= v; - 如果
op == 3,执行a[i][j] = v。
所有操作完成后,按行输出矩阵。
时间复杂度为 ,空间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int n, m, q;
long long a[55][55];
int main() {
cin >> n >> m >> q;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
while(q--) {
int op, x1, y1, x2, y2;
long long v;
cin >> op >> x1 >> y1 >> x2 >> y2 >> v;
for(int i = x1; i <= x2; i++) {
for(int j = y1; j <= y2; j++) {
if(op == 1) {
a[i][j] += v;
} else if(op == 2) {
a[i][j] -= v;
} else {
a[i][j] = v;
}
}
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cout << a[i][j];
if(j < m) {
cout << ' ';
}
}
cout << '\n';
}
return 0;
}
全部评论 93
666
2026-07-31 来自 浙江
396666666
2天前 来自 重庆
4
666
2026-07-30 来自 贵州
37666666666
2天前 来自 重庆
4
1
gygytf2026-07-30 来自 贵州
35666666666
2天前 来自 重庆
4
NB
2026-08-03 来自 浙江
316666666666
2天前 来自 重庆
3
d
2026-08-02 来自 河北
23NB
2026-07-31 来自 浙江
121
2026-07-31 来自 浙江
101
2026-07-31 来自 浙江
8k
2026-07-31 来自 广东
7s
2026-08-05 来自 广东
5as
2026-08-05 来自 广东
2
牛
2026-08-11 来自 浙江
2111
2026-08-08 来自 浙江
21
2026-08-07 来自 浙江
2gg
2026-08-05 来自 河北
2
2026-08-05 来自 广东
2欢乐赛终于考到细节编号了
2026-08-03 来自 浙江
26666666
2天前 来自 重庆
1666
6天前 来自 广东
1期待13期后的欢乐赛
1周前 来自 上海
11
2026-08-11 来自 浙江
1

























































有帮助,赞一个