官方题解 | 欢乐赛#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;
}
全部评论 80
666
2026-07-31 来自 浙江
32666
2026-07-30 来自 贵州
301
gygytf2026-07-30 来自 贵州
27NB
2026-08-03 来自 浙江
25d
2026-08-02 来自 河北
17NB
2026-07-31 来自 浙江
71
2026-07-31 来自 浙江
61
2026-07-31 来自 浙江
6k
2026-07-31 来自 广东
5s
2026-08-05 来自 广东
3as
2026-08-05 来自 广东
1
欢乐赛终于考到细节编号了
2026-08-03 来自 浙江
2期待13期后的欢乐赛
4天前 来自 上海
11
1周前 来自 浙江
11
1周前 来自 浙江
1刷评
1周前 来自 浙江
1牛
1周前 来自 浙江
1111
1周前 来自 浙江
11
1周前 来自 浙江
1gg
1周前 来自 河北
1
2026-08-05 来自 广东
1






















































有帮助,赞一个